版权声明
---------------------------------------------------------------------------------------------------------------------
该文章原创于Qter开源社区(www.qter.org)
作者: 女儿叫老白 (白振勇)
转载请注明出处!
---------------------------------------------------------------------------------------------------------------------
课程目录:《C++老鸟日记》目录
本套课程属于:《C++跨平台开发干货》系列课程。
--------------------------------------------------------------------------------------------------------------------
定义类CAnimal(野兽),它提供接口run(跑)、接口roar(吼叫)和接口eatSomething(吃东西)。
//:animal.h
lass CAnimal
{
public:
CAnimal(){}
virtual ~CAnimal(){}
virtual void run()=0;
virtual void roar()=0;
void eatSomething(){}
};
- 务必注意,类定义处以";"(分号)结束。否则导致的编译错误,可能很难查找到原因。
- 接口前面的virtual表示该接口是虚接口,可以被派生类覆盖。
- 接口后的=0,表示该接口是纯虚接口,派生类必须提供具体实现,否则派生类将无法实例化(无法用来声明对象)
- CAnimal(){}
这种语法,表示直接将接口的实现编写在头文件中,
当然也可以写成CAniaml();然后在派生类中编写接口的实现。
请注意,如果在头文件中只写接口声明,那在接口声明后一定用";"(分号)结束,如果在头文件中直接写定义(就是写上花括号),那么就如上述代码即可,无需以分号结束。
- ~CAnimal() 析构函数的前面用virtual表示该类的派生类析构时,其派生类的析构函数一定会被调用,这种语法可以保证编译器做到。否则,有可能在对象析构时只调用了父类的析构函数,却忘记调用派生类的析构函数,就可能导致内存泄漏。
定义类CDog(狗狗), 从CAniaml派生
//: dog.h
class CDog : public CAniaml
{
public:
CDog(){}
~CDog(){}
virtual void run(){ std::cout << "我在奔跑." << std::endl;}
virtual void roar() { std::cout << "汪汪" << std::endl};
}
- CDog类从CAnimal派生,因为CAnimal已经提供了eatSomething()接口,因此CDog无需再提供实现,它即可从父类自动派生该接口,除非它的行为与父类不同。
- CDlog的run()和roar()接口前仍旧写了virtual限定符,表示从父类继承而来的接口,当然CDog的virtual限定符也可以省略。我个人的建议是保留。