C++向上转型
1.派生类对象赋值给基类对象;
2.派生类指针赋值给基类指针;
【单纯这样的使用,向上转型是不完整的】
类型兼容原则
是指在需要基类对象的任何地方,都可以使用公有派生类的对象来替代。通过公有继承,派生类得到了基类中除构造函数、析构函数之外的所有成员。这样,公有派生类实际就具备了基类的所有功能,凡是基类能解决的问题,公有派生类都可以解决。类型兼容规则中所指的替代包括以下情况:
子类对象可以当作父类对象使用
子类对象可以直接赋值给父类对象
子类对象可以直接初始化父类对象
父类指针可以直接指向子类对象
父类引用可以直接引用子类对象
在替代之后,派生类对象就可以作为基类的对象使用,但是只能使用从基类继承的成员。
类型兼容规则是多态性的重要基础之一。
总结:子类就是特殊的父类 (base *p = &child;),注意,构造函数默认为私有的,私有的方法和属性在子类中是不可以被继承的,在子类中是无法访问的。
虚函数
(基类中的函数前加上 virtual)解决向上转型的完整性————向上转型后,可以使用基类的指针来访问派生类内的函数
前提:发生了函数遮蔽(覆盖)
工程意义:实现了多态
注意事项:
1.基类中用virual 声明成员函数为虚函数,类外实现虚函数时,不必再加virtual
2.在派生类中重新定义此函数称为覆写,要求函数名,返值类型,函数参数个数及类型全部匹配
3.为了避免在派生类写错虚函数,可在派生类里的虚函数中添加override修饰,确保该函数为虚函数并覆写来自基类的虚函数
多态
多态条件:
1.继承(并发生函数覆盖)
2.定义了虚函数
3.基类对象接受派生类对象无法产生多态;只有基类指针接受派生类指针和地址才能产生多态;
多态分类:
静多态:函数重载;
动态多态:基类的指针;(地址只有程序运行时候,才会产生指针的地址)
多态限制:
- 只有类的成员函数才能声明为虚函数;
- 静态成员函数不能是虚函数;
- 内联函数不能是虚函数
- 构造函数不能是虚函数
- 基类析构函数可以是虚函数且通常声明为虚函数
new delete
使用类名后面加上括号表示调用默认的构造函数,以创建对象的实例。如果不加括号,则表示声明了一个指向类的指针,但并没有创建对象的实例。
在C++中,你可以使用new运算符来动态分配内存,
并创建一个类的实例,并将其地址分配给指针。
以下是定义一个指针指向一个类的示例代码:
class MyClass {
public:
void myFunction() {
// 实现函数的代码
}
};
int main() {
MyClass* ptr; // 声明一个指向 MyClass 类的指针
ptr = new MyClass(); // 使用 new 运算符动态分配内存,并
创建一个 MyClass 对象,并将对象的地址赋给指针
ptr->myFunction(); // 通过指针调用 MyClass 的成员函数
delete ptr; // 使用 delete 运算符释放之前分配的内存
return 0;
}
在上面的示例中,通过new MyClass()语句使用new运算符分配内存,
并创建了一个MyClass的对象,并将对象的地址赋值给指针ptr。
然后,可以使用指针访问该对象的成员函数和成员变量。
最后,使用delete运算符释放先前分配的内存,以避免内存泄漏。