声明:
1、为了节省篇幅,头文件和域什么的都没写。另外可能是java转C++,有些叫法可能会不对
2、因初学,都是自己摸索的,有错望指出,勿喷
假设父类声明
Parent.h中如下
class Parent{
public:
Parent();
~Parent();
virtual void printByParent();
virtual void printVirtual();
virtual void printVirtualAll()=;
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()// 这个虚方法在子类和父类中都有实现,子类对像输出是自己的实现