在C++里继承虚基类和普通基类有什么区别?

来源:百度知道 编辑:UC知道 时间:2024/06/21 11:24:12
举个例子:

class Base{
public:
void show(){cout<<"Base class"<<endl;}
};

class A: public virtual Base{
public:
void show(){cout<<"Class A"<<endl;}
};

class B: public virtual Base{
public:
void show(){cout<<"Class B"<<endl;}
};

class C: public A,public B{
public:
void show(){cout<<"Class C"<<endl;}
};

int main(){
C c();
c.show();
return 0;
}

这个会输出什么?麻烦请解释一下。

Class C

c++ 重载 覆盖 隐藏的区别和执行方式

成员函数被重载的特征
(1)相同的范围(在同一个类中);
(2)函数名字相同;
(3)参数不同;
(4)virtual 关键字可有可无。
覆盖是指派生类函数覆盖基类函数,特征是
(1)不同的范围(分别位于派生类与基类);
(2)函数名字相同;
(3)参数相同;
(4)基类函数必须有virtual 关键字。
“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下
(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。
(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)
3种情况怎么执行:1。重载:看参数2。隐藏:用什么就调用什么3。覆盖:调用派生类

当某类的部分或全部直接基类是从另一个基类共同派生而来时,这直接基类中,从上一级基类继承来的成员就拥有相同的名称,派生类的对象的这些同名成员在内存中同时拥有多个拷贝,同一个函数名有多个映射。可以使用作用域分辨符来唯一标识并分别访问它们。也可以将共同基类设置为虚基类,这时从不同的路径继承过来的同名数据成员在内存中只拥有一个拷贝,同一个函数名也只有一个映射。也就是说虚基类解决了同名成员的唯一标识问题。

会输出:Class C
回答者: wanfustudio 回答的没有错,如果你想要把<<"Class A"<<也输出来,采用构造方法才行,他会先创建父类的对象。