C ++继承和构造函数,析构函数

时间:2012-11-27 06:01:07

标签: c++ inheritance constructor destructor

//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

2 个答案:

答案 0 :(得分:3)

有几件事要做:

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

您的最终布局可能如下所示。

<强> Parent.h

#ifndef PARENT_H_
#define PARENT_H_

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

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

#endif // PARENT_H_

<强> Child.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

<强> Child.cpp

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

Child::~Child()
{
}

void Child::func1()
{
}

答案 1 :(得分: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
$