![](/img/trans.png)
[英]Do you need to call virtual base class constructor from all derived classes? Even if they're not the most derived?
[英]Do I need to reimplement all the constructor of a base class even if a derived class has no member variables?
我们假设我有一个基类
class Base
{
public:
Base();
Base(int i, double j);
Base(int i, double j, char ch);
virtual void print();
private:
int m;
double l;
char n;
};
我想派生一个覆盖print函数的类,但除此之外与基类完全相同。
class Derived : public Base
{
public:
void print();
};
有没有一种方法可以在派生类上使用基类的所有构造函数,而无需为Derived类重写所有这些构造函数?
由于C ++ 11,你可以使用using
为:
class Derived : public Base
{
public:
using Base::Base; // use all constructors of base.
void print() override;
};
您可以调用基类的构造函数。 因此,如果您按如下方式定义Base
。
class Base
{
public:
Base() {};
Base(int i, double j) : m{i}, l{j} {};
Base(int i, double j, char ch) : m{i}, l{j}, n{ch} {};
virtual void print() { std::cout << "Base" << std::endl; };
private:
int m;
double l;
char n;
};
然后,您可以让Derived
具有类似的构造函数,这些构造函数使用Base
构造函数来初始化继承的成员变量。
class Derived : public Base
{
public:
Derived() : Base() {}
Derived(int i, double j) : Base(i, j) {}
Derived(int i, double j, char ch) : Base(i, j, ch) {}
void print() override { std::cout << "Derived" << std::endl; };
};
举个例子
int main()
{
Base b1{};
Base b2{1, 2};
Base b3{1, 2, 'a'};
Derived d1{};
Derived d2{1, 2};
Derived d3{1, 2, 'a'};
}
您可以通过委派构造函数和using声明来执行此操作,因为它在演示程序中显示,前提是您的编译器支持C ++ 2011.否则,您必须自己定义构造函数。
#include <iostream>
class Base
{
public:
Base() : Base( 0, 0.0, '\0' ) {}
Base(int i, double j) : Base( i, j, '\0' ) {}
Base(int i, double j, char ch) : m( i ), l( j ), n( ch ) {}
virtual ~Base() = default;
virtual void print() const { std::cout << m << ' ' << l << ' ' << n << std::endl; }
private:
int m;
double l;
char n;
};
class Derived : public Base
{
public:
using Base::Base;
void print() const override { Base::print(); }
};
int main()
{
Derived( 65, 65.65, 'A' ).print();
}
程序输出是
65 65.65 A
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.