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()// 这个虚方法在子类和父类中都有实现,子类对像输出是自己的实现
原文地址:https://www.cnblogs.com/boliu/p/3393755.html