【发布时间】:2015-06-12 18:48:00
【问题描述】:
我认为我需要的是一个纯虚函数,除了基类确实有一个派生类不能默认的实现(并且这个规则必须传播)。 final的反义词?
我有一些从公共基础派生的类型。基类是一种有用的类型,一些派生类型是从其他派生类型派生的。我将只使用对基类的引用,但我需要一个virtual operator==(),它可以看穿它并调用适合每种情况的手动比较。 operator==() 的一种二维 vtable。
重要的是,实现不要传播到派生类,因为意外发生这种情况可能会导致不兼容类型与基类实现之间的比较兼容类型,这可能产生误报。
我的意思是让特定的功能等效案例比较相等,尽管它们在不同的类中表示。不过,我预计问题会延伸到其他操作,也许我对operator==() 的使用在这里不合适。
我并没有声称自己知道 C++——我只是一个 C hack,试图成为惯用的。
这是我到目前为止的工作:
class base;
class foo;
class bar;
class baz;
#define COMPARE public: \
virtual bool equal(base const &p) const; \
virtual bool equal(foo const &p) const; \
virtual bool equal(bar const &p) const; \
virtual bool equal(baz const &p) const; \
virtual bool operator==(base const &p) const { return p.equal(*this); }
class base {
int a_;
public:
base(int a) : a_(a) {}
COMPARE
};
class foo : public base {
int b_;
public:
foo(int a, int b) : base(a), b_(b) {}
COMPARE
};
class bar : public base {
int c_;
public:
bar(int a, int c) : base(a), c_(c) {}
COMPARE
};
class baz : public bar {
int d_;
public:
baz(int a, int c, int d) : bar(a, c), d_(d) {}
COMPARE
};
现在,感谢COMPARE,所有T::equal() 都必须实现,并且不允许它们依赖于早期的实现。此外,每个类都有自己的operator==(),它为自己的类型(而不是基类类型)调用适当的equal()。
我想要的是以COMPARE 现在的方式强制执行这些规则,但不需要记住每个派生类都必须引用宏,并且理想情况下(要成为 C++ 惯用的)不使用宏全部。
正确的 C++ 方法是什么?
【问题讨论】:
-
实际上,如果有一个始终返回 false 的默认实现,并且能够覆盖不需要传播到派生类的覆盖,那么 真的 会很棒.
-
你能强调一下你想要完成什么吗?
-
@user64985,我希望让基类对派生类施加规则,并且避免必须记住在每个派生类中使用 C 宏来重新声明这些规则。
-
这不仅仅是like一个纯虚函数,而是一个纯虚函数。没有法律禁止定义纯虚函数,事实上有时它是必要的(析构函数)。
-
this 可能会给你一些想法
标签: c++ macros virtual-functions