amr*_*san 107 c++ inheritance
为什么我不能这样做?
class A
{
public:
int a, b;
};
class B : public A
{
B() : A(), a(0), b(0)
{
}
};
Run Code Online (Sandbox Code Playgroud)
In *_*ico 123
你不能初始化a
和b
in,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.
{
}
};
Run Code Online (Sandbox Code Playgroud)
NPE*_*NPE 24
撇开事实,他们是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) {}
};
Run Code Online (Sandbox Code Playgroud)
不知何故,没有人列出最简单的方法:
class A
{
public:
int a, b;
};
class B : public A
{
B()
{
a = 0;
b = 0;
}
};
Run Code Online (Sandbox Code Playgroud)
您不能访问初始化列表中的基成员,但是构造函数本身,就像任何其他成员方法一样,可以访问基类的public
和protected
成员。