C++ C++;继承:我必须在派生类中重复父属性吗?

C++ C++;继承:我必须在派生类中重复父属性吗?,c++,oop,inheritance,C++,Oop,Inheritance,如果我将类划分为头文件/实现文件,是否可以在不需要在子类中重新声明继承的属性的情况下进行继承 让我举例说明。为什么允许这样做(摘自): #包括 使用名称空间std; //基类 阶级形态{ 公众: 无效设置宽度(int w){ 宽度=w; } 空隙设置高度(内部高度){ 高度=h; } 受保护的: 整数宽度; 内部高度; }; //派生类 类矩形:公共形状{ 公众: int getArea(){ 返回(宽度*高度); } }; 内部主(空){ 矩形矩形; 直线设置宽度(5); 垂直高度(7); /

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

让我举例说明。为什么允许这样做(摘自):

#包括
使用名称空间std;
//基类
阶级形态{
公众:
无效设置宽度(int w){
宽度=w;
}
空隙设置高度(内部高度){
高度=h;
}
受保护的:
整数宽度;
内部高度;
};
//派生类
类矩形:公共形状{
公众:
int getArea(){
返回(宽度*高度);
}
};
内部主(空){
矩形矩形;
直线设置宽度(5);
垂直高度(7);
//打印对象的区域。

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

同时,派生类可以访问其基的
public
protected
成员,所以这就是第一个示例可以使用的原因

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

Programmer::Programmer(std::string name_, std::string surname_) {
    name = name_;
    surname = surname_;
}
注意,这意味着
名称
姓氏
将首先默认初始化(为空字符串),然后分配给
程序员
构造函数中传递的值。这是效率损失,在某些情况下可能非常明显


惯用的解决方法是给
Person
一个构造函数,该构造函数接受两个字符串参数并初始化成员,然后从
Programmer
构造函数调用此构造函数。

我不确定是什么让人困惑。成员初始化器列表只允许指定基类或者该类的直接成员。因此,您的第二个示例没有编译

同时,派生类可以访问其基的
public
protected
成员,所以这就是第一个示例可以使用的原因

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

Programmer::Programmer(std::string name_, std::string surname_) {
    name = name_;
    surname = surname_;
}
注意,这意味着
名称
姓氏
将首先默认初始化(为空字符串),然后分配给
程序员
构造函数中传递的值。这是效率损失,在某些情况下可能非常明显


惯用的解决方法是给
Person
一个构造函数,该构造函数接受两个字符串参数并初始化成员,然后从
Programmer
构造函数调用此构造函数。

Programmer
构造函数中,初始化器列表中初始化的变量只能是v直接来自该类或基类构造函数的变量


但是在成员函数/构造函数的主体中,如果继承变量在
程序员
构造函数中有效地
公共
受保护
,则可以使用继承变量,在初始值设定项列表中,初始化的变量只能是直接来自该类或基类构造函数的变量


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

您没有声明
程序员
来实现名为
speak
的函数,并且在某些情况下您不会为
虚拟
创建重写类中的函数(这通常适用于任何OOP语言)@但是属性
名称
姓氏
呢?我得到了关于
程序员
没有这些属性的错误。这是因为它们受到了保护。错误的原因完全不同。您没有声明
程序员
来实现名为
speak
的函数,并且存在一些情况不为类中的
virtual
函数创建重写(这通常适用于任何OOP语言)@但是属性
name
name
呢?我会发现程序员没有这些属性的错误。这是因为它们受到了保护。错误的原因完全不同。让我困惑的是
getArea()
如何引用
宽度
高度
(它们在
Shape
中受
保护
),但我不能以同样的方式在
程序员
构造函数中引用
名称
姓氏
。@LukeCollins您没有“以同样的方式”引用它们-如果将赋值放入构造函数体中,它的工作方式与第一个示例相同。成员初始化列表不同。@ LukeCulrs的答案很简单——因为这是C++设计的方式。初始化成员是类构造函数的责任(这是整点!),但派生类可以访问这些成员。现在我明白你的意思了。因此,将它们放在主体中是解决方案。谢谢。让我困惑的是
getArea()
如何引用
width
height
(它们在
Shape
中受
保护),但我不能以相同的方式在
程序员
构造函数中引用
名称
姓氏
。@LukeCollins您不是以“相同的方式”引用它们-如果将赋值放入构造函数体中,它的工作方式与第一个示例相同。成员初始化列表不同。@ LukeCulrs的答案很简单——因为这是C++设计的方式。初始化成员是类构造函数的责任(这是整点!),但派生类可以访问这些成员。现在我明白你的意思了。因此,将它们放在正文中是解决方案。谢谢。