C++ 继承:是否必须在派生类中重复父属性?



如果我将我的类分成头/实现文件,是否可以在不重新声明子类中的继承属性的情况下进行继承?

让我用一个例子来澄清。为什么允许这样做(从这里获取(:

#include <iostream>
using namespace std;
// Base class
class Shape {
public:
void setWidth(int w) {
width = w;
}
void setHeight(int h) {
height = h;
}
protected:
int width;
int height;
};
// Derived class
class Rectangle: public Shape {
public:
int getArea() { 
return (width * height); 
}
};
int main(void) {
Rectangle Rect;
Rect.setWidth(5);
Rect.setHeight(7);
// Print the area of the object.
cout << "Total area: " << Rect.getArea() << endl;
return 0;
}

但这不是(尝试在这里编译(:

#include <string>
#include <iostream>
// HEADER FILE
class Person {   
public:
virtual void speak() = 0;
protected:
std::string name;
std::string surname;
};
class Programmer : public Person {
public:
Programmer(std::string, std::string);
};
// CPP FILE
Programmer::Programmer(std::string name, std::string surname) : 
name(name), 
surname(surname) 
{}
void Programmer::speak(){
std::cout << "My name is " + name + " " + surname + " and I like to code!";
}

我不确定什么是令人困惑的。成员初始值设定项列表仅允许指定此类的基类或直接成员。因此,您的第二个示例无法编译。

同时,派生类可以访问其基publicprotected成员,因此这就是第一个示例可以的原因。

一个有趣的观察结果是,将编译以下代码:

Programmer::Programmer(std::string name_, std::string surname_) {
name = name_;
surname = surname_;
}

请注意,这意味着namesurname将首先默认初始化(为空字符串(,然后将它们分配给Programmer构造函数中传递的值。这是效率损失,在某些情况下可能非常明显。

习惯性地解决这个问题的正确方法是购买给Person一个接受两个字符串参数并初始化成员的构造函数,而不是从构造函数调用Programmer构造函数。

Programmer构造函数的初始值设定项列表中,初始化的变量只能是直接来自该类或基类构造函数的变量。

但是在成员函数/构造函数的主体中可以使用继承的变量,如果它们被有效地publicprotected

相关内容

最新更新