4
//Parent.h
class Parent{
public:
   Parent(){}
   ~Parent(){}
   virtual void func1() = 0;
};

//Child.h
#include "Parent.h"
class Child : public Parent{
  int x, y;
public:
  Child() : Parent(){ //constructor

  }
  virtual void func1();
};

//Child.cpp
#include "Child.h"
void Child::Parent::func1(){

}

这编译得很好,但是,我想把 Child 类的构造函数(和析构函数)的实现放在它的 cpp 文件中,这可能吗?如何?

我已经尝试了下面的代码,但它抛出了对 vtable for Child 的未定义引用

Child::Child() : Parent(){  //in the cpp
}

Child(); //in the header file 
Child():Parent(); //also tried this one
4

2 回答 2

3

您需要做的几件事:

  • 保护发布您的头文件,以防止意外的多次包含。
  • 使您的 Parent 析构函数虚拟化
  • 初始化您的非自动成员变量以确定值。

您的最终布局可能看起来像这样。

父.h

#ifndef PARENT_H_
#define PARENT_H_

class Parent
{
public:
    Parent() {};
    virtual ~Parent() {};

public:
    virtual void func1() = 0;
};

#endif // PARENT_H_

孩子.h

#ifndef CHILD_H_
#define CHILD_H_

#include "Parent.h"

class Child : public Parent
{
    int x,y;

public:
    Child();
    virtual ~Child();

    virtual void func1();
};
#endif

孩子.cpp

Child::Child()
   : Parent()     // optional if default
   , x(0), y(0)   // always initialize members to determinate values
{
}

Child::~Child()
{
}

void Child::func1()
{
}
于 2012-11-27T06:27:00.413 回答
0
$ cat Parent.h 
#ifndef GUARD_PARENT_H_
#define GUARD_PARENT_H_

class Parent{
public:
   Parent(){}
   ~Parent(){}
   virtual void func1() = 0;
};

#endif /* GUARD_PARENT_H_ */
$ cat Child.h
#ifndef GUARD_CHILD_H_
#define GUARD_CHILD_H_

#include "Parent.h"

class Child : public Parent{
  int x, y;
public:
  Child();
  virtual void func1();
};

#endif /* GUARD_CHILD_H_ */
$ cat Child.cpp
#include "Child.h"

Child::Child() : Parent() {
}

void Child::func1(){
}
$ cat try.cc
#include "Child.h"

int main() {
        Child c;
}
$ g++ try.cc Child.cpp
$ ./a.out
$
于 2012-11-27T06:10:41.483 回答