建设监理工程公司网站,seo公司推荐推广平台,wordpress会员中心页面,南联网站建设哪家好虚析构函数 存在父类指针指向子类对象的情况#xff0c;应该将析构函数声明为虚函数#xff08;虚析构函数#xff09;
纯虚函数 纯虚函数#xff1a;没有函数体且初始化为0的虚函数#xff0c;用来定义接口规范 抽象类#xff1a; 含有纯虚函数的类#xff0c;不可以实…虚析构函数 存在父类指针指向子类对象的情况应该将析构函数声明为虚函数虚析构函数
纯虚函数 纯虚函数没有函数体且初始化为0的虚函数用来定义接口规范 抽象类 含有纯虚函数的类不可以实例化不可以创建对象 抽象类也可以包含非纯虚函数、成员变量 如果父类是抽象类子类没有完全实现纯虚函数那么这个子类依然是抽象类
#includeiostream
using namespace std;
struct Animal
{virtual void speak() 0;virtual void run() 0;
};
struct Dog:Animal
{void speak() {cout Dog::speak() endl;}void run() {cout Dog::run() endl;}
};
struct Cat:Animal
{void speak() {cout Cat::speak() endl;}void run() {cout Cat::run() endl;}
};
int main() {Animal* cat new Cat();cat-run();return 0;
}
多继承 C允许一个类可以有多个父类不建议使用会增加程序设计复杂度
#includeiostream
using namespace std;
struct Student
{int m_score;void study() {cout Student::study()-score m_score endl;}
};
struct Worker
{int m_salary;void work() {cout Worker::work()-salary m_salary endl;}
};
struct Undergragduate:Student,Worker
{int m_grade;void play() {cout Undergragduate::play()-grader m_grade endl;}
};
int main() {Undergragduate ug;ug.m_grade 10;ug.m_salary 20;ug.m_score 30;ug.study();ug.work();ug.play();return 0;
}
多继承-虚函数 如果子类继承得多个父类都有虚函数那么子类对象就会产生对应的多张虚表 菱形继承 菱形继承带来的问题 最底下子类从基类继承的成员变量冗余、重复 最底下的子类无法访问基类的成员有二义性 Undergraduate对象大小为20个字节虚继承 虚继承可以解决菱形继承带来的问题 Person类被称为虚基类#includeiostream
using namespace std;
struct Person
{int m_age;
};
struct Student:virtual Person
{int m_score;
};
struct Worker:virtual Person
{int m_salary;
};
struct Undergragduate :Student, Worker
{int m_grade;
};
int main() {Undergragduate ug;//ug.m_grade 10;//ug.m_salary 20;//ug.m_score 30; return 0;
} 静态成员static 静态成员被static修饰的成员变量\函数 可以通过对象对象.静态成员、对象指针对象指针-静态成员、类访问类名::静态成员 静态成员变量 存储在数据段全局区类似于全局函数整个程序运行过程中只有一份内存 对比全局变量它可以设定访问权限public、protected、private达到局部共享的目的 必须初始化必须在类外面初始化初始化时不能带static如果类的声明和实现分离在实现.cpp中初始化静态成员函数 内部不能使用this指针this指针只能用在非静态成员函数内部即不需要传入调用者的地址给this 不能是虚函数虚函数只能是非静态成员函数理解因为虚函数主要是用来实现多态的用于对象的调用 内部不能访问非静态成员变量\函数只能访问静态成员变量\函数 非静态成员函数内部可以访问静态成员变量\函数 构造函数和析构函数不能是静态的 当声明和实现分离时实现部分不能带static
#includeiostream
using namespace std;
class Car {
public:static int m_price;void run() {cout run() endl;}
};
int Car::m_price 0;
int main() {Car car;car.m_price 100;Car car1;car1.m_price 200;Car::m_price 300;return 0;
}