我有这种代码:
class Ref {<undefined>};
Ref refObjectForA, refObjectForB;
class Base
{
public:
Base(const Ref & iRef) : _ref(iRef) {}
virtual ~Base() {}
const Ref & ref;
};
class A: public Base
{
public:
A() : Base(refObjectForA) {}
virtual ~A() {}
};
class B: public A
{
public:
B() : Base(refObjectForB) {} // won't compile: Base is not direct base of B
virtual ~B() {}
};
由于属性是一个引用,我想我只能在构造函数中设置它,所以我需要Base
在B()
. 我找到了两种方法:提供一个“前向”构造函数A
(但这意味着在所有可能被继承的类中添加代码):
A(const Ref& iRef): Base(iRef)
或使用虚拟继承:
class A: public virtual Base
第二个选项允许在B
实现中使用更直接的代码,但我想知道我是否在丑陋的把戏中滥用了虚拟继承,或者它是否是一个有效的用例。
- 在这种情况下我可以使用虚拟继承吗?
- 如果不是,是什么原因?
我发现的“意外”行为之一是,由于虚拟继承,不可能指向指向指针的static_cast
指针。Base
B
此外,我还想知道它为什么起作用(我的意思是为什么 a B().ref == refObjectForB
):我认为对默认A()
构造函数的隐式调用B()
会在显式构造函数之后覆盖ref
属性Base
,但虚拟继承可能并非如此。