【发布时间】:2011-08-03 20:44:57
【问题描述】:
我在这个例子中应用多态性有一些问题。这个问题和我上一个问题类似
C++, virtual inheritance, strange abstract class + clone problem
有3个抽象类:
class A
{
public:
virtual A * copy () const = 0;
virtual ~A() = 0;
};
A::~A(){}
class B
{
public:
virtual B * copy () const = 0;
virtual ~B() = 0;
};
B::~B(){}
class C: virtual public A , public B
{
public:
virtual C * copy () const = 0;
virtual ~C() = 0;
};
C::~C(){}
和两个使用虚拟继承的继承类
class D: virtual public A
{
public:
virtual D * copy () const {return new D (*this);}
virtual ~D() {}
};
class E: virtual public D , public C
{
public:
virtual E * copy () const {return new E (*this);}
virtual ~E() {}
}; //Error C2250: 'E' : ambiguous inheritance of 'D *A::copy(void) const
上述错误仅使用MSVS 2010编译器出现,g++编译此代码OK。
类图(简化)
.......... A .... B.....
........../.\..../......
........./...\../.......
......../.....\/........
.......D...... C........
........\...../.........
.........\.../..........
..........\./...........
...........E............
最后的讨论我们以结果结束:从类 C 中删除 copy() 方法的声明。
class C: virtual public A , public B
{
public:
//virtual C * copy () const = 0; //remove declaration
virtual ~C() = 0;
};
C::~C(){}
我使用多态性的示例代码需要创建指向 C 的指针向量。删除一些元素后,我想创建它的副本...我需要在 C 类中声明 copy(),因此删除声明是不够的,并且并不能解决问题。
int main(int argc, char* argv[])
{
std::vector <C*> items;
items.push_back(new E());
items.push_back(new E());
items[0]->copy();
return 0;
}
您能帮我吗,请如何更正代码以使用 VS 2010 进行翻译?
【问题讨论】:
-
在您最喜欢的 C++ 书籍、常见问题解答或参考站点中查找
virtual继承。还可以在网上搜索“C++ 可怕的钻石继承”。 -
我知道这个问题......但它与我的问题有什么关系?这段代码是正确的,但是 MSVS 2010 没有编译它但是 g++ ant 其他编译器是的......
标签: c++ visual-c++ covariance visual-c++-2010 virtual-inheritance