以下代码打印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) 这是我们理想的继承层次结构:
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.这不会是一个问题,只是我想使用上面任意组合的多重继承,这样我就可以在任何平台上使用服务器/客户端功能,并在客户端或服务器上使用平台功能.
我不禁觉得这是多重继承的一个常见问题...我是从完全错误的角度来解决这个问题吗?
另外,考虑到我们可以使用它#ifdef来解决这个问题,但是,这会产生非常难看的代码,例如:
CFoobar::CFoobar()
#if SYSAPI_WIN32
: m_someData(1234)
#endif
{
}
Run Code Online (Sandbox Code Playgroud)
...哎!
对于那些想要更多地了解这个问题的人,我真的建议浏览相应的邮件列表线程.在第3篇文章开始变得有趣.还有一个相关的代码提交,您可以在此处查看有问题的真实代码.
我知道C#不支持多重继承,而且解决方案是使用接口.但我不明白的是为什么接口不像多继承那样创建钻石问题.如何使用接口避免多重继承的陷阱?
给定以下代码(没有虚拟继承):
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
当我看到代码片段之类的时候
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?为什么有人需要这个呢?
我已经检查了其他问题,令人惊讶的是,这个问题似乎没有被问到.使用Extension方法,接口提供有限但真正的实现多重继承.这带来了Diamond问题,与基于类的多重继承相同.为什么这比基于类的多重继承更好或更可接受,这么多人似乎觉得这么可怕?它实际上似乎是一种更糟糕的实现多重继承的方式,因为扩展方法不能进入接口本身,甚至不能进入实现接口的类,但最终可能分散在多个静态实用程序类中.
Eric Lippert在他的博客(2009年10月5日上午9:29)似乎对扩展属性的概念持开放态度,甚至提到了扩展事件,扩展操作符,扩展构造函数(也称为"工厂模式")的可能性.因此可以进一步扩展通过接口的实现.
编辑:为了阐明一个类是否继承了两个接口,这两个接口都具有相同名称和类型参数的扩展方法,那么如果在没有显式命名接口的情况下调用方法,则会产生编译错误.考虑到这一点,我错了,因为这不是钻石问题.然而,考虑到这一点提出了一个问题,即钻石问题与其他歧义相比有多重要?为什么Diamond问题是如此困难,以至于它不能用简单的编译错误来获取,就像接口扩展方法类碰撞并且不能隐式解析一样?即使在基于类的多重继承中,也可能存在非基于Diamond的成员签名冲突.
language-agnostic oop single-responsibility-principle multiple-inheritance solid-principles
所以,我有这样的情况.
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和 …
我想创建一个可以从两个自定义类继承的类.你有什么想法吗?请看下面我的例子:
头等舱:
@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)
我想创建一个可缩放和可拖动的自定义视图.你有什么想法吗?(没有复制代码..)
我认为类似协议,但我想要基类的默认值?我如何使用协议或类似协议来实现这一点.
谢谢你的回复!
我有以下情况:
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)
以下是我的问题:
我知道实例方法将覆盖默认方法,但是如果类中的静态方法与Interface中的默认方法具有相同的签名呢?
如果静态方法m1()在class C将公共那么编译错误将是:
静态方法m1()与I.中的抽象方法冲突
因此,当访问修饰符是默认值时,它试图隐藏,当它是公共时,它是冲突的.为什么会有这种差异?它背后的概念是什么?