【发布时间】:2013-06-24 10:42:16
【问题描述】:
在多重继承中,我有一个虚拟的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;
}
【问题讨论】:
-
因为虚基类的构造函数是从最派生类调用的。在您的示例中,您希望
Base::Base( std::string )收到什么参数? -
这是有道理的。与在虚拟基类中一样,我们将只有一个共享对象,因此哪个类( A 或 B )应该构造它,因为它们将不同的字符串传递给构造函数。如果大多数派生类都在构造它,那就没有混淆。