从具有命名构造函数问题的Base类继承

时间:2011-02-16 20:31:22

标签: c++

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”。我想 当我继承基类时,出了点问题。任何建议表示赞赏! 它。

5 个答案:

答案 0 :(得分:4)

两个主要问题:

为了使用像您正在尝试的多态基类,必须使用引用,指针或智能指针。由于对象m1m2m3MeshGeneration类型的纯变量,因此无论函数是什么,它们都不会真正成为DerivedMeshGeneration =最初创建的权利。

DerivedMeshGeneration::CreateUnstrMesh()MeshGeneration::CreateUnstrMesh()功能相同,因此它从不首先创建派生对象。

答案 1 :(得分:2)

此处您的代码打印出来:

Unstr called
mesh_type = unstructured
Str called!
mesh_type = structured
Unstr called
mesh_type = unstructured

它应该发生的事情。

m1m2m3MeshGeneration类型的对象,而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();