Derived Class C++
Derived Class C++
我知道这可能是一个愚蠢的问题,但我什至不知道如何命名这个问题。我的母语不是英语。我从一本书中学到C++,有一个程序显示员工的姓名和工资率(基类)和Manager
(派生类),并添加了bool
变量salaried
。以下是源代码:
//base class
class Employee {
private:
string name;
double pay;
public:
Employee() {
name = "";
pay = 0;
}
Employee(string empName, double payRate) {
name = empName;
pay = payRate;
}
string getName() const {
return name;
}
void setName(string empName) {
name = empName;
}
double getPay() const {
return pay;
}
void setPay(double payRate) {
pay = payRate;
}
string toString() {
stringstream stm;
stm << name << ": " << pay;
return stm.str();
}
};
//derived class
class Manager : public Employee {
private:
bool salaried;
public:
Manager(string name, double payRate, bool isSalaried)
:Employee(name, payRate)
{
salaried = isSalaried;
}
bool getSalaried() {
return salaried;
}
};
int main()
{
Employee emp1("Mary Smith", 15.00);
cout << "Employee name: " << emp1.getName() << endl;
cout << "Employee pay rate: " << emp1.getPay() << endl;
Manager emp2("Bob Brown", 1500, true);
cout << "Employee name: " << emp2.getName() << endl;
cout << "Employee pay rate: " << emp2.getPay() << endl;
cout << "Is Salaried: " << emp2.getSalaried() << endl;
return 0;
}
有人可以解释为什么这部分
:Employee(name, payRate)
必须添加到代码中才能正常工作?
零件
:Employee(name, payRate)
你提到的是用来调用构造函数的
Employee(string empName, double payRate)
在执行构造函数主体之前Employee
基类
Manager(string name, double payRate, bool isSalaried)
的派生类Manager
.
它调用基类的 (Employee) 构造函数,并将name
和payRate
传递给它,因为它们是 Employee 的成员。
:Employee(name, payRate)
是类Manager
继承的基类的初始化。
事实上,如果没有这一行,代码应该可以很好地编译(因为你有一个默认的Employee
构造函数),但是从Employee
继承的字段将无法在emp2
中正确初始化。这部分代码的作用是调用 Employee
的构造函数来初始化从该类继承的字段。
构造函数上的冒号后面是什么,称为初始化列表,在您的情况下,它只是使用合适的构造函数启动基类
即使没有构造函数,代码也可以正常工作(即您可以使用默认构造函数接受变量并实现两种方法来填充name
和pay
。
class Employee {
private:
string name;
string temp_name;
double temp_pay;
double pay;
public:
Employee() {
name = temp_name;
pay = temp_pay;
}
void getTempname(string tem){temp_name = tem;}
void getTemppay(double py){ temp_pay = pay;}
};
相关文章:
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- "Undefined class"作为is_base_of的论据
- 如何将class.cpp和class.hpp编译为一个.o文件
- '{'标记之前的预期类名,然后在预声明时无效使用不完整的类型'class class_name'
- 如何使用"derived input class"创建派生类?
- 错误:"Left of getValue must have class/struct/union"
- ' class a : b ' 和 ' class a : public b ' 之间的继承类不同
- Pybind11 Class Definition
- 在C++中使用没有合作伙伴Class/Cpp文件的头文件是否实用
- C2011 'CMemDC':Visual Studio 2019中的'class'类型重新定义
- TypeError: [c++ addon class] 不是构造函数
- C++ class template
- 当初始值设定项是基类名时'initializer does not name a non-static data member or base class'错误
- Clearing Class Foo with new(pFoo) Foo()
- C++ class vs a library
- 继承类时"invalid use of incomplete type ‘class tree_node_t’"
- 使用"class"关键字,后跟未声明的标识符
- VSCode - C++对"CLASS::FUNCTION"的未定义引用