#include "stdafx.h"
#include<iostream>
using namespace std;
//1. 一个类中可以声明一个或多个纯虚函数,只要有纯虚函数的类就是抽象类
//2. 抽象类只能作为其他类的基类,不能用来建立对象,又称抽象基类
//3. 如果派生类只是简单地继承了抽象类的纯虚函数,而没有重新定义基类的纯虚函数,则派生类也是一个抽象类
class A{
public:
virtual void fun () = 0; // 纯虚函数
};
class B:public A{
public:
void fun (){cout<<"实现纯虚函数的定义成功"<<endl;} // 重写基类纯虚函数
};
// 只有派生类与基类的虚函数具有完全相同的函数名、返回类型以及参数表,才能实现虚函数的特性
class C:public A{
public:
void fun (int i){cout << "fun (int i) 并不是基类纯虚函数 fun () 的实现版本"<<endl;}
};
//PS: 以下两种声名没有区别
int *i,j = NULL;
int* p,q = NULL;
int _tmain(int argc, _TCHAR* argv[])
{
cout << i << endl;
cout << j << endl;
cout << p << endl;
cout << q << endl;
//A a; // 错误:A 是抽象类,不能建立对象
B b;
//C c; // 错误:C 并没有实现基类的纯虚函数,所以 C 仍是抽象类,不能建立对象
A *p1 = NULL;
A *p2 = NULL;
p1 = &b;
p2 = new B;
//p1.fun (); // 错误:left of '.fun' must have class/struct/union
//p2.fun (); // 错误:left of '.fun' must have class/struct/union
p1->fun();
p2->fun();
A &a = b;
a.fun();
//a->fun (); // 错误:type 'A' does not have an overloaded member 'operator ->'
// 错误: '->A::fun' : left operand has 'class' type, use '.’
cin.get();
return 0;
}