派生类和基类的同名成员问题
派生类中再实现一个基类中的方法会怎样
(1)代码实验:派生类和基类中各自实现一个内容不同但函数原型完全相同的方法,会怎么样
(2)结论:基类对象调用的是基类的方法,派生类对象调用执行的是派生类中重新提供的方法
(3)这种派生类中同名同参方法替代掉基类方法的现象,叫做:重定义(redefining),也有人叫做隐藏。
(4)隐藏特性生效时派生类中实际同时存在2份同名同参(但在不同类域名中)的方法,同时都存在,只是一个隐藏了另一个
#include <iostream>
// 基类
class Animal {
public:
std::string name_;
// 带参数的基类构造函数
Animal(const std::string &name) : name_(name) {
std::cout << "Animal constructor called for " << name_ << std::endl;
}
// 基类析构函数
virtual ~Animal() {
std::cout << "Animal destructor called for " << name_ << std::endl;
}
void printf_name() { std::cout << "name_:" << name_ << std::endl; }
private:
};
// 派生类
class Pigeon : public Animal {
public:
// 带参数的派生类构造函数
Pigeon(const std::string &name, int age) : Animal(name), age_(age) {
std::cout << "Pigeon constructor called for " << name << " aged " << age_
<< std::endl;
}
// 派生类析构函数
~Pigeon() {
std::cout << "Pigeon destructor called for age " << age_ << std::endl;
}
void printf_name() { std::cout << "11 name_:" << this->name_ << std::endl; }
private:
int age_;
};
int test070101() {
Animal a("Polly1");
a.printf_name();
Pigeon p("Polly", 3);
p.printf_name();
return 0;
}
类型兼容规则的常见情况及演示
(1)子类对象可以当作父类对象使用,也就是说子类对象可以无条件隐式类型转换为一个父类对象
(2)子类对象可以直接初始化或直接赋值给父类对象
(3)父类指针可以直接指向子类对象
(4)父类引用可以直接引用子类对象
总结
理解什么是隐藏(重定义)
派生类对象直接调用时,隐藏规则生效,直接调用的肯定是派生类中重新实现的那一个
子类是一个拥有父类属性和方法加上拥有自己的属性和方法的独立的类,可以降级变成父类来用
学习记录,侵权联系删除。
来源:朱老师物联网大课堂