在多重继承中,我有一个虚拟的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;
}
答案 0 :(得分:4)
虚拟基础由派生最多的对象构成。所以AB
的构造函数调用Base
构造函数,但由于你没有为AB
指定构造函数,因此它的默认构造函数只调用Base
的默认构造函数。 / p>
您可以像AB
这样调用字符串构造函数:
struct AB : A, B
{
AB() : Base("hello"), A(), B() { }
};
请注意,构造函数A::A()
和B:B()
执行而不是在此设置中调用Base
构造函数!