标签: multiple-inheritance

有关C++中多重继承,虚拟基类和对象大小的问题

以下代码打印20,即sizeof(z)为20.

#include <iostream.h>
class Base
{
      public:
            int a;
};

class X:virtual public Base
{
      public:
            int x;
};

class Y:virtual public Base
{
      public:
            int y;
};

class Z:public X,public Y
{
};

int main()
{
Z z;
cout << sizeof(z) <<endl;
}
Run Code Online (Sandbox Code Playgroud)

如果我不在这里使用虚拟基类,即对于以下代码:sizeof(z)是16.

#include <iostream.h>
class Base
{
      public:
            int a;
};

class X:public Base
{
      public:
            int x;
};

class Y:public Base
{
      public:
            int y;
};

class Z:public X,public Y
{
};

int main()
{
Z …
Run Code Online (Sandbox Code Playgroud)

c++ sizeof multiple-inheritance

12
推荐指数
2
解决办法
4422
查看次数

使用C++,如何正确地从同一个基类继承两次?

这是我们理想的继承层次结构:

class Foobar;

class FoobarClient : Foobar;

class FoobarServer : Foobar;

class WindowsFoobar : Foobar;

class UnixFoobar : Foobar;

class WindowsFoobarClient : WindowsFoobar, FoobarClient;

class WindowsFoobarServer : WindowsFoobar, FoobarServer;

class UnixFoobarClient : UnixFoobar, FoobarClient;

class UnixFoobarServer : UnixFoobar, FoobarServer;
Run Code Online (Sandbox Code Playgroud)

这是因为我们的继承层次结构会尝试从Foobar两次继承,因此,编译器会抱怨任何成员的模糊引用Foobar.

请允许我解释为什么我想要这么复杂的模型.这是因为我们希望有来自同一个变量访问WindowsFoobar,UnixFoobar,FoobarClient,和FoobarServer.这不会是一个问题,只是我想使用上面任意组合的多重继承,这样我就可以在任何平台上使用服务器/客户端功能,并在客户端或服务器上使用平台功能.

我不禁觉得这是多重继承的一个常见问题...我是从完全错误的角度来解决这个问题吗?

更新1:

另外,考虑到我们可以使用它#ifdef来解决这个问题,但是,这会产生非常难看的代码,例如:

CFoobar::CFoobar()
#if SYSAPI_WIN32
: m_someData(1234)
#endif
{
}
Run Code Online (Sandbox Code Playgroud)

...哎!

更新2:

对于那些想要更多地了解这个问题的人,我真的建议浏览相应的邮件列表线程.在第3篇文章开始变得有趣.还有一个相关的代码提交,您可以在此处查看有问题的真实代码.

c++ multiple-inheritance

12
推荐指数
3
解决办法
8234
查看次数

如何使用接口克服C#中的多重继承问题?

我知道C#不支持多重继承,而且解决方案是使用接口.但我不明白的是为什么接口不像多继承那样创建钻石问题.如何使用接口避免多重继承的陷阱?

c# oop inheritance interface multiple-inheritance

12
推荐指数
1
解决办法
8982
查看次数

多个(菱形)继承编译时没有"虚拟",但没有

给定以下代码(没有虚拟继承):

class A
{
public:
    virtual void f() = 0;
};

class B : public A
{
 public:
    virtual void f() {}
};

class C : public A
{
 public:
    virtual void f() {}
};

class D : public B, public C
{

/* some code */
};


int main()
{
    D d;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

代码编译.

另一方面,这里:

class A
{
public:
    virtual void f() = 0;
};

class B : virtual public A
{
    virtual void f() {}
}; …
Run Code Online (Sandbox Code Playgroud)

c++ virtual overriding multiple-inheritance virtual-inheritance

12
推荐指数
2
解决办法
1960
查看次数

即将发布的Java 8版本中的虚拟扩展方法

当我看到代码片段之类的时候

  interface A {
      void a();
      void b() default { System.out.println("b"); };
      void c() final { System.out.println("c"); };
  }
Run Code Online (Sandbox Code Playgroud)

我有一个问题.我们还没有得到足够的Java?为什么有人需要这个呢?

java interface multiple-inheritance diamond-problem java-8

12
推荐指数
3
解决办法
3747
查看次数

为什么C#允许通过接口扩展方法而不是类来进行多重继承?

我已经检查了其他问题,令人惊讶的是,这个问题似乎没有被问到.使用Extension方法,接口提供有限但真正的实现多重继承.这带来了Diamond问题,与基于类的多重继承相同.为什么这比基于类的多重继承更好或更可接受,这么多人似乎觉得这么可怕?它实际上似乎是一种更糟糕的实现多重继承的方式,因为扩展方法不能进入接口本身,甚至不能进入实现接口的类,但最终可能分散在多个静态实用程序类中.

Eric Lippert在他的博客(2009年10月5日上午9:29)似乎对扩展属性的概念持开放态度,甚至提到了扩展事件,扩展操作符,扩展构造函数(也称为"工厂模式")的可能性.因此可以进一步扩展通过接口的实现.

编辑:为了阐明一个类是否继承了两个接口,这两个接口都具有相同名称和类型参数的扩展方法,那么如果在没有显式命名接口的情况下调用方法,则会产生编译错误.考虑到这一点,我错了,因为这不是钻石问题.然而,考虑到这一点提出了一个问题,即钻石问题与其他歧义相比有多重要?为什么Diamond问题是如此困难,以至于它不能用简单的编译错误来获取,就像接口扩展方法类碰撞并且不能隐式解析一样?即使在基于类的多重继承中,也可能存在非基于Diamond的成员签名冲突.

c# inheritance extension-methods multiple-inheritance

12
推荐指数
3
解决办法
2996
查看次数

实施多个接口是否违反单一责任原则?

来自维基百科:

单一责任原则规定每个班级应该承担一项责任,并且该责任应完全由班级封装.

这是否意味着实现多个接口违反了这一原则?

language-agnostic oop single-responsibility-principle multiple-inheritance solid-principles

12
推荐指数
1
解决办法
1327
查看次数

Python调用父方法多重继承

所以,我有这样的情况.

class A(object):
    def foo(self, call_from):
        print "foo from A, call from %s" % call_from


class B(object):
    def foo(self, call_from):
        print "foo from B, call from %s" % call_from


class C(object):
    def foo(self, call_from):
        print "foo from C, call from %s" % call_from


class D(A, B, C):
    def foo(self):
        print "foo from D"
        super(D, self).foo("D")

d = D()
d.foo()
Run Code Online (Sandbox Code Playgroud)

代码的结果是

foo from D
foo from A, call from D
Run Code Online (Sandbox Code Playgroud)

我想调用所有父方法,在这种情况下,foo方法,从D类中不使用超类在父类A.我只是想从D班上打电话给超级.的A,B和 …

python inheritance class multiple-inheritance

12
推荐指数
2
解决办法
6078
查看次数

IOS的多重继承

我想创建一个可以从两个自定义类继承的类.你有什么想法吗?请看下面我的例子:

头等舱:

@interface UIZoomableView : UIView
{
    UITapGestureRecognizer *_tapGestureRecognizer;
}
Run Code Online (Sandbox Code Playgroud)

和实施:

- (void)onDoubleTap:(UITapGestureRecognizer *)sender
{
    CGSize newSize;
    CGPoint centerPoint = self.center;
    if ([self isSmall])
    {
        newSize = [self bigSize];
    }
    else
    {
        newSize = [self smallSize];
    }

    [UIView animateWithDuration:0.3 animations:^{
        self.size = newSize;
        self.center = centerPoint;
    }];
}
Run Code Online (Sandbox Code Playgroud)

二等:

@interface UIDraggableView : UIView

    UIPanGestureRecognizer *_panGestureRecognizer;

@end
Run Code Online (Sandbox Code Playgroud)

执行:

- (void)handlePan:(UIPanGestureRecognizer*)sender
{
    ..
}
Run Code Online (Sandbox Code Playgroud)

我想创建一个可缩放和可拖动的自定义视图.你有什么想法吗?(没有复制代码..)

我认为类似协议,但我想要基类的默认值?我如何使用协议或类似协议来实现这一点.

谢谢你的回复!

protocols interface subclass multiple-inheritance ios

12
推荐指数
2
解决办法
2362
查看次数

类中的静态方法与接口中的默认方法具有相同的签名

我有以下情况:

class C {
    static void m1() {}
}

interface I {
    default void m1() {}
}

//this will give compilation error : inherited method from C cannot hide public abstract method in I
class Main extends C implements I {

}
Run Code Online (Sandbox Code Playgroud)

以下是我的问题:

  1. 我知道实例方法将覆盖默认方法,但是如果类中的静态方法与Interface中的默认方法具有相同的签名呢?

  2. 如果静态方法m1()class C将公共那么编译错误将是:

    静态方法m1()与I.中的抽象方法冲突

因此,当访问修饰符是默认值时,它试图隐藏,当它是公共时,它是冲突的.为什么会有这种差异?它背后的概念是什么?

java inheritance multiple-inheritance default-method

12
推荐指数
2
解决办法
625
查看次数