C++初学 virtual 相关
声明:
1、为了节省篇幅,头文件和域什么的都没写。另外可能是java转C++,有些叫法可能会不对
2、因初学,都是自己摸索的,有错望指出,勿喷
假设父类声明
Parent.h中如下
class Parent{ public: Parent(); ~Parent(); virtual void printByParent(); virtual void printVirtual(); virtual void printVirtualAll()=0; void print(); void invoke(); };
Parent.cpp 如下
Parent::Parent(){} Parent::~Parent(){} void Parent::printVirtual(){ cout<<"parent_printVirtual"<<endl; } void Parent::print(){ cout<<"parent_printf"<<endl; } void Parent::printVirtualAll(){ cout<<"parent_printVirtualAll"<<endl; } void Parent::printByParent(){ cout<<"parent_printVirtualAll"<<endl; } void Parent::invoke(){ this->print(); this->printVirtual(); this->printVirtualAll(); this->printByParent(); }
1、是否是抽象类
带virtual 声明方法的非抽象类:如果.h 文件中只有virtual void printVirtual();这样的声明,且在.cpp 文件中实现了。则,这个类是可以初始化的,非抽象类。抽象类两种情况:virtual void printVirtualAll()=0;如果这个类像这样声明了抽象方法,就算他再.cpp文件中实现了,这个类依然是抽象方法,不可直接初始化。且无论这个方法在父类有没有实现,子类也必须实现这个方法后,才能成为非抽象方法virtual void printVirtual(); 像这样声明了,但是却没有在.cpp文件中实现,则,这个类也是抽象类。如果这样声明的方法在父类中都有实现,其子类不覆写,依然是非抽象类
2、继承关系
有子类 ChildA
ChildA.h 如下
class ChildA:public Parent{ public: ChildA(); ~ChildA(); void printVirtual(); void print(); void printVirtualAll(); };
ChildA.app 如下
ChildA::ChildA(){} ChildA::~ChildA(){} void ChildA::print(){ cout<<"childA print"<<endl; } void ChildA::printVirtual(){ cout<<"childA printVirtual"<<endl; } void ChildA::printVirtualAll(){ cout<<"childA printVirtualAll"<<endl; }
运行输出如下
结果说明,只有父类声明了为virtual 的时候,子类覆写才有意义。
相关的说明:
void print(){//这个方法不是虚方法,子类自己实现,不影响
void printVirtualAll(){//这个虚方法实现不实现都没关系,因为声明为=0,但是如果调用Parent::printVirtualAll还是有效的
void printByParent(){//这个虚方法在这里设定测试为只父类实现,子类没有实现,正常调用
virtual void printVirtual()// 这个虚方法在子类和父类中都有实现,子类对像输出是自己的实现