【发布时间】:2012-05-01 17:10:01
【问题描述】:
#include <iostream>
using namespace std;
class base
{
public:
virtual void taunt() = 0;
virtual void hide() = 0;
};
template <int nx, int ny>
class derivedA : public base
{
void hide();
public:
void taunt() { cout << "derivedA" << endl; }
char c[nx][ny];
};
template <int nx, int ny, int nz>
class derivedB : public base
{
void taunt();
public:
void hide() { cout << "hide B" << end; }
char c[nx][ny][nz];
};
int main()
{
derived * dp = new derivedA();
dp->taunt();
delete dp;
DerivedB b;
dp = &b;
dp->hide();
return 0;
}
A 和 B 都是从纯虚拟类基派生的,并且都有一个未实现的方法。不实施一种方法是否合法?不实施一种方法是可以接受的还是好的做法?有更好的方法吗?
编辑: 我刚刚注意到这些类不是从基类派生的。我已经更改了代码,所以它确实如此。
【问题讨论】:
-
“A 和 B 都派生自纯虚类基” -- 不,它们不是。他们都是毫无根据的。
-
你不能用一个未实现的方法来实例化一个类。在随机编译器上试一下,你会看到编译错误。
-
derived * dp = new derivedA();:derived不是类型,derivedA()是非法的:derivedA<4, 5>()。 -
说或希望你的类是从某个基类派生的并不是这样。您需要将基类指定为
class derivedA : public base { ... };这样做并尝试在任何编译器上编译您的代码,您将自己回答您的问题。 -
@BorisStrandjev:不正确。只要您不尝试调用这些方法,就可以使用未实现的方法实例化一个类。这通常通过复制构造函数来完成,以使类不可复制。不能实例化的是纯虚函数的类。