class MeshGeneration{
public:
static MeshGeneration CreateUnstrMesh() {
cout<<"Unstr called"<<endl;
return MeshGeneration(0);}
static MeshGeneration CreateStrMesh() {
cout<<"Str called!"<<endl;
return MeshGeneration(1);}
virtual void CreateHybridMesh(){}
protected:
MeshGeneration(int mesh_type = -1){
string mstring;
if(mesh_type == 0)
mstring = "unstructured";
else if(mesh_type == 1)
mstring = "structured";
else;
cout <<"mesh_type = "<<mstring<<endl;
}
};
class DerivedMeshGeneration:public MeshGeneration{
public:
void CreateHybridMesh(){
cout<<"mesh_type = hybrid"<<endl;
}
};
int main(int argc, char * argcv[]){
MeshGeneration m1 = MeshGeneration::CreateUnstrMesh();
MeshGeneration m2 = MeshGeneration::CreateStrMesh();
MeshGeneration m3 = DerivedMeshGeneration::CreateUnstrMesh();
m3.CreateHybridMesh(); // not working as expected..
return 0;
}
最后一个功能没有按预期工作 - 打印出“mesh_type = hybrid”。我想 当我继承基类时,出了点问题。任何建议表示赞赏! 它。
答案 0 :(得分:4)
两个主要问题:
为了使用像您正在尝试的多态基类,必须使用引用,指针或智能指针。由于对象m1
,m2
和m3
是MeshGeneration
类型的纯变量,因此无论函数是什么,它们都不会真正成为DerivedMeshGeneration
=
最初创建的权利。
DerivedMeshGeneration::CreateUnstrMesh()
与MeshGeneration::CreateUnstrMesh()
功能相同,因此它从不首先创建派生对象。
答案 1 :(得分:2)
此处您的代码打印出来:
Unstr called
mesh_type = unstructured
Str called!
mesh_type = structured
Unstr called
mesh_type = unstructured
它应该发生的事情。
m1
,m2
和m3
是MeshGeneration
类型的对象,而MeshGeneration::CreateHybridMesh
不会打印任何内容。
为了打印mesh_type = hybrid
,您应该有一个DerivedMeshGeneration
类型的对象(或指向DerivedMeshGeneration
的指针/引用或指向/引用实例的MeshGeneration
DerivedMeshGeneration
)。
答案 2 :(得分:1)
在这一行:
MeshGeneration m3 = DerivedMeshGeneration::CreateUnstrMesh();
您正在复制DerivedMeshGeneration :: CreateUnstrMesh()的返回值,该副本的类型为MeshGeneration。因此,被调用的函数是MeshGeneration中的函数。
您应该使用指针或引用。
答案 3 :(得分:1)
问题是
DerivedMeshGeneration::CreateUnstrMesh()
不创建DerivedMeshGeneration
的实例,而是创建MeshGeneration
的实例。
答案 4 :(得分:1)
谢谢你们。现在这正如我所料:
DerivedMeshGeneration * m3 = new DerivedMeshGeneration;
M3-&GT; CreateHybridMesh();