为什么在虚拟基多重继承中只调用基类默认构造函数
Why only base class default constructor is called in virtual base multiple inheritance?
在多重继承中,我有一个虚拟Base
类,由类A
和类B
继承。 A
和 B
是 AB
的基类。请参阅下面的代码。在 A
和 B
的构造函数中,Base(string)
构造函数被调用。我希望得到以下输出:
Base::Base(std::string)
A::A()
B::B()
但是我得到以下输出:
Base::Base()
A::A()
B::B()
为什么要调用 Base
的默认构造函数?
#include<iostream>
#include<string>
using namespace std;
class Base{
public:
Base(){
cout<<__PRETTY_FUNCTION__<<endl;
}
Base(string n):name(n){
cout<<__PRETTY_FUNCTION__<<endl;
}
private:
string name;
};
class A : public virtual Base {
public:
A():Base("A"){
cout<<__PRETTY_FUNCTION__<<endl;
}
private:
string name;
};
class B : public virtual Base {
public:
B():Base("B"){
cout<<__PRETTY_FUNCTION__<<endl;
}
private:
string name;
};
class AB : public A, public B{
};
int main(){
AB a;
}
虚拟基础由派生最多的对象构造。所以AB
的构造函数调用了Base
构造函数,但由于您没有为 AB
指定构造函数,因此它的默认构造函数只调用 Base
的默认构造函数。
你可以像这样从AB
调用字符串构造函数:
struct AB : A, B
{
AB() : Base("hello"), A(), B() { }
};
请注意,构造函数A::A()
和B:B()
不会在此设置中调用Base
构造函数!
相关文章:
- 使用基类指针调用基类的值构造函数的语法是什么?
- 在初始化列表之外手动调用基类的构造函数
- 继承:调用基类的成员和方法
- 在成员构造函数之后调用基类构造函数
- C++初始化之前派生类调用基类的方法
- 如何在具有相同函数名称的派生类中调用基类的函数
- 有没有办法在C++中调用基类的所有子类函数?
- C++:在派生类成员上调用基类方法
- 添加字符串类型的类成员会导致调用基类函数而不是子函数
- 有没有办法调用基类函数,该函数在使用私有继承的派生类中被覆盖?
- 如何在C++中调用基类虚函数
- 如何让派生类在调用基类之前执行操作?
- 在调用基类之前需要在成员上调用方法
- 调用基类克隆实现
- 在派生类中调用基类方法,而无需指定基类名称
- 从参数包中派生的调用基类运算符 =
- 当应该调用派生类方法时,为什么要调用基类方法
- 调用基类函数时强制使用类名?
- 无法从派生的一个方法调用基类方法
- 当派生类无法轻易将参数传递到基类时,如何调用基类构造函数