继承和组合 - 基类具有指向派生类的指针

时间:2011-07-09 11:49:01

标签: visual-c++ inheritance

我想知道我是否可以有两个类看起来像这样:

//file: Small.h
#pragma once
#include "Little.h"

class Small :
    public Little
{
public:
    Small(void){}
    ~Small(void){}

};

//file: Little.h
#pragma once
#include <iostream>
#include "Small.h"

using namespace std;

//class Small;
class Little
{
public:
    Little(){ s = 0; }
    void print(){ cout << "oops!" << endl; }
    Small* s; 
};

现在我的问题是:当我想创建一个“Small”类型的对象并调用它的“print()”函数时,VS-2010说“class'Fold'没有名为'print()'的成员。”解决方案是什么?

1 个答案:

答案 0 :(得分:0)

以下应该可行,但是,您应该以这种方式构造类,基类应该具有派生类类型的成员。

然而,由于成员只是一个指针,代码应该仍然可以编译和工作,但是你要求错误。

您的代码问题是必须在创建类之前定义Small类Little和Little bfroe您创建Small

您应该在一个文件中执行如下操作,因为它们是相互依赖的

//file: SmallLittle.h
#pragma once
#include <iostream>

using namespace std;

class Small;

class Little
{
public:
    Little(){ s = 0; }
    void print(){ cout << "oops!" << endl; }
    Small* s; 
};

class Small :
    public Little
{
public:
    Small(void){}
    ~Small(void){}

};

然而,由于Small是Little的成员类型,您可能更好地创建单个类,如下所示,使用您的代码的唯一原因是您可以使用未定义或使用Small的Little代码。但是在这种情况下,最好使用void *类型作为指针。

跟随

//file: Small.h
#pragma once
#include <iostream>

using namespace std;

class Small;

class Small
{
public:
    Small(){ s = 0; }
    void print(){ cout << "oops!" << endl; }
    Small* s; 
    ~Small(void){}
};

另外,我认为您不需要将s设置为0,因为这是NULL,这应该是值,直到您使用new赋值指针创建指针。