如何在派生类构造函数中初始化基类成员变量
How can I initialize base class member variables in derived class constructor?
为什么我不能这样做?
class A
{
public:
int a, b;
};
class B : public A
{
B() : A(), a(0), b(0)
{
}
};
无法初始化B
中的a
和b
,因为它们不是B
的成员。它们是A
的成员,因此只有A
可以初始化它们。您可以将它们公开,然后在B
中进行赋值,但这不是推荐的选项,因为这会破坏封装。相反,在A
中创建一个构造函数,允许B
(或A
的任何子类(初始化它们:
class A
{
protected:
A(int a, int b) : a(a), b(b) {} // Accessible to derived classes
// Change "protected" to "public" to allow others to instantiate A.
private:
int a, b; // Keep these variables private in A
};
class B : public A
{
public:
B() : A(0, 0) // Calls A's constructor, initializing a and b in A to 0.
{
}
};
抛开它们是private
这一事实不谈,因为a
和b
是A
的成员,所以它们应该由A
的构造函数初始化,而不是由其他类的构造函数(派生或非派生(初始化。
尝试:
class A
{
int a, b;
protected: // or public:
A(int a, int b): a(a), b(b) {}
};
class B : public A
{
B() : A(0, 0) {}
};
不知怎么的,没有人列出最简单的方法:
class A
{
public:
int a, b;
};
class B : public A
{
B()
{
a = 0;
b = 0;
}
};
不能访问初始值设定项列表中的基成员,但构造函数本身,就像任何其他成员方法一样,可以访问基类的public
和protected
成员。
# include<stdio.h>
# include<iostream>
# include<conio.h>
using namespace std;
class Base{
public:
Base(int i, float f, double d): i(i), f(f), d(d)
{
}
virtual void Show()=0;
protected:
int i;
float f;
double d;
};
class Derived: public Base{
public:
Derived(int i, float f, double d): Base( i, f, d)
{
}
void Show()
{
cout<< "int i = "<<i<<endl<<"float f = "<<f<<endl <<"double d = "<<d<<endl;
}
};
int main(){
Base * b = new Derived(10, 1.2, 3.89);
b->Show();
return 0;
}
如果您想初始化Derived类对象中存在的基类数据成员,而您想通过Derived class构造函数调用推送这些值接口,这是一个有效的例子。
为什么不能这样做?因为该语言不允许初始化派生类初始值设定项列表中的基类成员。
你怎么能做到这一点?像这样:
class A
{
public:
A(int a, int b) : a_(a), b_(b) {};
int a_, b_;
};
class B : public A
{
public:
B() : A(0,0)
{
}
};
虽然这在极少数情况下很有用(如果不是这样,语言会直接允许它(,但请查看"成员基础"习语。这不是一个无代码的解决方案,您必须添加额外的继承层,但它可以完成任务。为了避免样板代码,您可以使用boost的实现
聚合类,如示例(*(中的A,其成员必须是公共的,并且没有用户定义的构造函数。它们是用初始值设定项列表初始化的,例如A a {0,0};
,或者在您的情况下是B() : A({0,0}){}
。在派生类的构造函数中,不能单独初始化基聚合类的成员。
(*(准确地说,正如正确提到的,由于私有非静态成员
class A
不是聚合
相关文章:
- C++初始化基类
- C++17 使用驱动类常量作为基类构造函数的参数来初始化基类构造函数
- 我是否需要在虚拟继承类的构造函数中初始化基类以解决菱形继承问题?
- 使用成员的地址初始化基类是否合法?
- 初始化基类成员 (c++) 的首选方法
- 类的构造函数必须显式初始化基类
- OOP - 抽象类类型,初始化基类和派生类中的变量
- 初始化基类和派生类中的类成员变量
- 为什么 C++ 的创建者决定使用构造函数初始值设定项列表来初始化基类?
- 通过drived类模板值通过基类构造器初始化基类数组成员变量
- 使用派生的[C++]生成的参数初始化基类
- C++ 在派生类中初始化基类的 const int?
- C++是否要求您从其派生类初始化基类成员
- 通过 CRTP 使用派生类变量初始化基类静态常量变量
- 初始化基类,派生类的构造函数中没有默认构造函数
- 我可以调用一个虚拟函数来初始化基类子对象吗
- 如何初始化基类构造函数的向量
- 初始化基类
- 在派生类的构造函数的主体中初始化基类成员变量
- 初始化基类的引用成员