我正在尝试创建一个基类和一个派生类,该类具有必须初始化的const成员:
class baseClan
{
public:
baseClan(const string firstName)
:
fullName(createFullName(firstName))
{}
private:
const string lastName = "Smith";
const string fullName;
virtual const string createFullName(string firstName) { return firstName + " " + lastName ; }
}
我如何实现派生类,以便它可以使用不同实现的createFullName?我正在查看此链接https://isocpp.org/wiki/faq/strange-inheritance#calling-克托成语中的虚但我似乎陷入了进退两难的境地:它提出的第一种方法(使用init(不适用于初始化列表;而在第二种方法中,明确指出它不能处理我们需要访问Derived中声明的实例数据的情况。
从构造函数或析构函数调用虚拟函数是危险的,应尽可能避免。所有C++实现都应该调用在当前构造函数的层次结构级别定义的函数版本,而不是进一步调用。
构造函数中的虚拟函数的工作方式不同。创建派生类的对象时,首先创建基类的对象,这意味着派生类尚未创建,虚拟函数尚未被覆盖。
我认为您提供的链接(C++常见问题解答(已经描述了解决这个问题的所有可能方法。但我强烈建议重新思考您的代码。
您可以应用稍微不同的方法。您可以使基构造函数接受参数来初始化数据字段,然后在派生类中使用初始化列表将必要的参数(甚至可能来自虚拟函数(传递给基构造函数。例如:
class A {
public:
A(int a, int b) : a_(a), b_(b) { }
virtual int getA() const = 0;
virtual int getB() const = 0;
void print() { cout << a_ << ' ' << b_ << endl; }
private:
const int a_ = 0;
const int b_ = 0;
};
class B : public A {
public:
B() : A(getA(), getB()) { }
int getA() const override { return 1; }
int getB() const override { return 2; }
};
int main() {
B b;
b.print();
return 0;
}