c++中的继承:错误C2011

Inheritance in C++: Error C2011

本文关键字:错误 C2011 继承 c++      更新时间:2023-10-16

我试图通过继承在c++屏幕上显示不同颜色的tile。我有一个基类叫做Tile,然后有两个派生类叫做GreenTile和VanillaTile。

在我的主程序中,当我通过创建一个GreenTile对象或一个VanillaTile对象只创建一个GreenTile或一个VanillaTile时,它可以正常工作:

GreenTile greenTile(0,0);
greenTile.show(screen);

问题是,当我创建GreenTile和VanillaTile对象并尝试显示两者时,我得到"错误C2011: 'Tile': 'class'类型重新定义"。

GreenTile greenTile(0,0);
VanillaTile vanillaTile(0,0);
greenTile.show(screen);
vanillaTile.show(screen);

您遇到的问题与继承无关:这是使用所谓的include保护的问题。注意,这些通常只会防止编译器发出的多个定义错误,而不是链接器发出的。

在您的源代码中,main是(假设是main.cpp),您可能有

#include "GreenTile.h"    // (1)
#include "VanillaTile.h"  // (2)

在每个标题中都有

#include "Tile.h"

如果您的Tile.h没有包含守卫,您将包含两次类Tile的定义。你的Tile.h应该像这样:

#ifndef TILE_H
#define TILE_H
class Tile
{
   ...
};
#endif

预处理器复制main.cpp开头头(1)和(2)的内容。使用它们,它复制了两次Tile.h,但由于这些保护,只保留了第一个副本的内容。这样,当编译器看到Tile类的单一定义时,它就不会抱怨了。

在这种情况下也可以使用#pragma。#pragma有一些优于include保护的优点:它包含更少的代码,避免了名称冲突,有时需要更少的编译时间。