c++中一些基本的继承问题
Some basic Inheritance problems in C++
这些天我正在VS2010中学习c++编程中的OO。我在c++中遇到了一些基本的继承问题。下面是我的代码:
问题1:
class bs
{
public:
int a;
virtual void name(){};
};
class A:virtual public bs
{
public:
int a;
virtual void name(){};
};
class B:virtual public bs
{
public:
int a;
virtual void name(){};
};
class D:virtual public bs
{
public:
int a;
virtual void name(){};
};
class C:public A,public B,public D
{
};
编译器给我错误C2250。当我从每个类中删除虚拟继承时。例如
class bs
{
public:
int a;
virtual void name(){};
};
class A:public bs
{
public:
int a;
virtual void name(){};
};
class B:public bs
{
public:
int a;
virtual void name(){};
};
class D:public bs
{
public:
int a;
virtual void name(){};
};
class C:public A,public B,public D
{
};
生效。同样,如果我在错误代码中重写C类中的virtual void name(){};
,编译器会运行良好。所以我的问题是,为什么在虚继承情况下强制重写虚函数是必要的,而在非虚继承情况下却没有必要。
问题2:
如上面的代码所示,当我想在非虚拟继承情况下添加bs *mybs = new C();
时
class bs
{
public:
int a;
virtual void name(){};
};
class A:public bs
{
public:
int a;
virtual void name(){};
};
class B:public bs
{
public:
int a;
virtual void name(){};
};
class D:public bs
{
public:
int a;
virtual void name(){};
};
class C:public A,public B,public D
{
virtual void name(){};
};
//bs *mybs = new C(); //C2594
编译器显示错误C2594。但是在虚拟继承情况下,编译器没有错误。
class bs
{
public:
int a;
virtual void name(){};
};
class A:virtual public bs
{
public:
int a;
virtual void name(){};
};
class B:virtual public bs
{
public:
int a;
virtual void name(){};
};
class D:virtual public bs
{
public:
int a;
virtual void name(){};
};
class C:public A,public B,public D
{
virtual void name(){};
};
bs *mybs = new C();//It is OK
在虚拟继承情况下有什么问题?
我认为这两个问题在c++中并不难,但很基础。但是,我不熟悉c++版本的OO。谢谢你帮我解决了问题。
Q1:给定虚拟继承,派生类只获得bs
对象的一个实例,而name()
有三个实现,它不知道该使用哪个。如果非虚拟派生,则在A、B和D类中嵌入三个B基,每个B基都可以覆盖实现。或者,您已经发现可以用c中的一个实现替换虚继承之后的模糊实现。
Q2:在非虚拟情况下,您在嵌入的A, B和D对象中有三个bs
基:您想要指针指向哪一个?它是模糊的,所以你会得到错误。如果你使用了虚拟继承,那么只有一个bs
基对象,你可以得到一个指向它的指针。
VIRTUAL NON-VIRTUAL
. bs bs bs bs
. / | | | |
. A B D A B D
. | / | /
. C C
左边,你的问题是C
不知道使用A::name()
, B::name()
或D::name()
中的哪一个,除非你在C
中覆盖所有三个。
在右边,你的问题是b* my_b_ptr
不知道该指向哪个bs
基数
相关文章:
- 模板继承问题
- 我是否需要在虚拟继承类的构造函数中初始化基类以解决菱形继承问题?
- SIGSEGV 因为基/派生类的继承问题
- C++解决没有虚拟继承的钻石继承问题
- Arduino C 中的继承问题
- C++ 继承问题:未定义对"vtable"的引用
- 班级设计和继承问题
- C 继承问题错误C2084功能已经具有主体
- 如何在C++中解决网格继承问题
- 多重继承问题 C++
- "{"令牌 c++ 继承问题之前的另一个预期类名
- C 模板继承问题(警告和错误)
- 协助解决C++的继承问题
- 在我的示例中,实际上有一些C 继承问题
- 继承问题
- C++继承问题
- C++初学者继承问题
- 公共/受保护/私有继承问题
- 函数继承问题
- 引用类型和继承问题