13-C++面向对象(纯虚函数(抽象类)、多继承、多继承-虚函数、菱形继承、虚继承、静态成员)

墨蓝 2024-03-26 20:43 148阅读 0赞

虚析构函数

存在父类指针指向子类对象的情况,应该将析构函数声明为虚函数(虚析构函数)

纯虚函数

纯虚函数:没有函数体且初始化为0的虚函数,用来定义接口规范

抽象类:

含有纯虚函数的类,不可以实例化(不可以创建对象)

抽象类也可以包含非纯虚函数、成员变量

如果父类是抽象类,子类没有完全实现纯虚函数,那么这个子类依然是抽象类

  1. #include<iostream>
  2. using namespace std;
  3. struct Animal
  4. {
  5. virtual void speak() = 0;
  6. virtual void run() = 0;
  7. };
  8. struct Dog:Animal
  9. {
  10. void speak() {
  11. cout << "Dog::speak()" << endl;
  12. }
  13. void run() {
  14. cout << "Dog::run()" << endl;
  15. }
  16. };
  17. struct Cat:Animal
  18. {
  19. void speak() {
  20. cout << "Cat::speak()" << endl;
  21. }
  22. void run() {
  23. cout << "Cat::run()" << endl;
  24. }
  25. };
  26. int main() {
  27. Animal* cat = new Cat();
  28. cat->run();
  29. return 0;
  30. }

多继承

C++允许一个类可以有多个父类(不建议使用,会增加程序设计复杂度)

  1. #include<iostream>
  2. using namespace std;
  3. struct Student
  4. {
  5. int m_score;
  6. void study() {
  7. cout << "Student::study()-score=" << m_score << endl;
  8. }
  9. };
  10. struct Worker
  11. {
  12. int m_salary;
  13. void work() {
  14. cout << "Worker::work()-salary=" << m_salary << endl;
  15. }
  16. };
  17. struct Undergragduate:Student,Worker
  18. {
  19. int m_grade;
  20. void play() {
  21. cout << "Undergragduate::play()-grader=" << m_grade << endl;
  22. }
  23. };
  24. int main() {
  25. Undergragduate ug;
  26. ug.m_grade = 10;
  27. ug.m_salary = 20;
  28. ug.m_score = 30;
  29. ug.study();
  30. ug.work();
  31. ug.play();
  32. return 0;
  33. }

多继承-虚函数

如果子类继承得多个父类都有虚函数,那么子类对象就会产生对应的多张虚表

5bcf278ea1ae4760bcf2bc10194d89e4.png

菱形继承

菱形继承带来的问题:

  • 最底下子类从基类继承的成员变量冗余、重复
  • 最底下的子类无法访问基类的成员,有二义性
  • Undergraduate对象大小为20个字节

df7a7735dd6b4cf9b11329020dee8b67.png

虚继承

  • 虚继承可以解决菱形继承带来的问题
  • Person类被称为虚基类

f1e996b545e34f26af909da1719d365a.png

  1. #include<iostream>
  2. using namespace std;
  3. struct Person
  4. {
  5. int m_age;
  6. };
  7. struct Student:virtual Person
  8. {
  9. int m_score;
  10. };
  11. struct Worker:virtual Person
  12. {
  13. int m_salary;
  14. };
  15. struct Undergragduate :Student, Worker
  16. {
  17. int m_grade;
  18. };
  19. int main() {
  20. Undergragduate ug;
  21. //ug.m_grade = 10;
  22. //ug.m_salary = 20;
  23. //ug.m_score = 30;
  24. return 0;
  25. }

c1cbe3d2b71d49c79a325d646cf6d565.png

静态成员(static)

静态成员:被static修饰的成员变量\函数

可以通过对象(对象.静态成员)、对象指针(对象指针->静态成员)、类访问(类名::静态成员)

静态成员变量:

  1. 存储在数据段(全局区,类似于全局函数),整个程序运行过程中只有一份内存
  2. 对比全局变量,它可以设定访问权限(public、protected、private),达到局部共享的目的
  3. 必须初始化,必须在类外面初始化,初始化时不能带static,如果类的声明和实现分离(在实现.cpp中初始化)

静态成员函数:

  1. 内部不能使用this指针(this指针只能用在非静态成员函数内部),即不需要传入调用者的地址给this
  2. 不能是虚函数,(虚函数只能是非静态成员函数)理解:因为虚函数主要是用来实现多态的,用于对象的调用
  3. 内部不能访问非静态成员变量\函数,只能访问静态成员变量\函数
  4. 非静态成员函数内部可以访问静态成员变量\函数
  5. 构造函数和析构函数不能是静态的
  6. 当声明和实现分离时,实现部分不能带static

    include

    using namespace std;
    class Car {
    public:

    1. static int m_price;
    2. void run() {
    3. cout << "run()" << endl;
    4. }

    };
    int Car::m_price = 0;
    int main() {

    1. Car car;
    2. car.m_price = 100;
    3. Car car1;
    4. car1.m_price = 200;
    5. Car::m_price = 300;
    6. return 0;

    }

发表评论

表情:
评论列表 (有 0 条评论,148人围观)

还没有评论,来说两句吧...

相关阅读

    相关 C++:53---菱形继承继承

    一、菱形继承 在介绍虚继承之前介绍一下菱形继承 概念:A作为基类,B和C都继承与A。最后一个类D又继承于B和C,这样形式的继承称为菱形继承 菱形继承的缺

    相关 C++函数继承

    虚函数的定义要遵循以下重要规则:      1.如果虚函数在基类与派生类中出现,仅仅是名字相同,而形式参数不同,或者是返回类型不同,那么即使加上了virtual关键字,也是不