目录
一、静态联编和动态联编
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
class Animal {
public:
virtual void speak()
{
cout << "动物在说话" << endl;
}
};
class Cat : public Animal {
public:
void speak()
{
cout << "小猫在说话" << endl;
}
};
class Dog : public Animal {
public:
void speak()
{
cout << "小狗在说话" << endl;
}
};
//多态动态产生条件
//先有继承关系
//父类中有虚函数 子类重写父类虚函数
//父类的指针或者引用 指向子类的对象
//对于有父子关系的两个类 指针或者引用 可以直接转换
void DoSpeak(Animal &animal)
{
//如果地址早就绑定好了 地址早绑定 属于静态联编
//如果想调用小猫说话 这个时候函数的地址就不能早绑定了 而是在运行阶段再去绑定函数的地址 属于地址晚绑定 动态联编
animal.speak();
}
void test01()
{
Cat cat;
Dog dog;
DoSpeak(cat);
DoSpeak(dog);
}
int main()
{
test01();
system("pause");
return EXIT_SUCCESS;
}
二、虚函数原理剖析
三、纯虚函数和抽象类
借用前面的计算器案例
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
//设计原则 开闭原则
//对扩展进行开放 对修改进行关闭
class AbstractCalculator {
public:
//纯虚函数
//如果一个类中包含了纯虚函数 那么这个类就无法实例化对象 这个类通常称为抽象类
//抽象类的子类 必须重写父类中的纯虚函数 否则这个子类也是抽象类
virtual int GetResult() = 0;
//virtual int GetResult()
//{
// return 0;
//}
int m_A;
int m_B;
};
class Test : public AbstractCalculator {
public:
};
//加法
class AddCalculator : public AbstractCalculator {
public:
int GetResult()
{
return m_A + m_B;
}
};
//减法
class SubCalculator : public AbstractCalculator {
public:
int GetResult()
{
return m_A - m_B;
}
};
//乘法
class MulCalculator : public AbstractCalculator {
public:
int GetResult()
{
return m_A * m_B;
}
};
void test01()
{
AbstractCalculator* calculator = new AddCalculator;
calculator->m_A = 10;
calculator->m_B = 20;
cout << "加法实现结果:" << calculator->GetResult() << endl;
calculator = new SubCalculator;
calculator->m_A = 10;
calculator->m_B = 20;
cout << "减法实现结果:" << calculator->GetResult() << endl;
calculator = new MulCalculator;
calculator->m_A = 10;
calculator->m_B = 20;
cout << "乘法实现结果:" << calculator->GetResult() << endl;
}
int main()
{
//test01();
//AbstractCalculator abc; //纯虚函数无法实例化对象
//Test t; //没有重写纯虚函数的子类也无法实例化对象
system("pause");
return EXIT_SUCCESS;
}
四、向上向下类型转换
五、重载、重写、重定义
重载
重写
重定义
class A{
public:
//同一作用域下,func1函数重载
void func1(){}
void func1(int a){}
void func1(int a,int b){}
void func2(){}
virtual void func3(){}
};
class B : public A{
public:
//重定义基类的func2,隐藏了基类的func2方法
void func2(){}
//重写基类的func3函数,也可以覆盖基类func3
virtual void func3(){}
};