我不确定这是否可以远程实现,但在这里: 派生类是否有可能不继承基类函数(不将它们设为私有/保护或将它们覆盖为空定义)? 类似的东西:
class base{
public:
virtual int f();
virtual int g();
};
class derived1: public base //<-- this would inherit f() but not g()
class derived2: public base //<-- this would inherit g() but not f()
答案 0 :(得分:1)
不,不是。即便如此,这也是一个设计缺陷。
如果derived1
是-a base
,为什么不继承其所有成员?这就是继承所代表的。
答案 1 :(得分:1)
将方法标记为虚拟的重点是获取继承。我不明白你为什么要把它标记为虚拟,但不能继承。那么你想解决的问题是什么?
答案 2 :(得分:1)
如果你想做某事,“事物”应该有目的。 你想要做的事情总体上打败了虚函数和继承的整个想法。 没有任何情况可以保证这种类型的构造。
由于遗产与现实世界如此相关,孩子是否可以选择父母的特征。 我猜不是(虽然在这种情况下它可能很有用。:))
答案 3 :(得分:0)
这实际上违背了继承的要点。这是不可能的。
答案 4 :(得分:0)
我只是想谈谈设计概念和可能出现的情况。
我有一个名为Range的基类,如下所示:
class Range
{
private:
int max;
int min;
int value;
virtual void SetMax(int);
virtual void SetMin(int);
public:
Range(int max, int min);
virtual void SetValue(int v);
virtual int GetValue() const;
virtual ~Range();
Range & operator =(int);
Range & operator =(const Range &);
};
这个基类用于Date&amp;我们写的时间课:
class Month : public Range
{
public:
Month();
Month(int);
Month(const Month &);
~Month();
Month & operator =(int);
Month & operator =(const Month &);
const wchar_t * const AsString() const;
};
并且Month的一个构造函数看起来像这样:
ptiDate::Month::Month(int v):Range(12,1)
{
SetValue(v);
}
但是当定义Day类的时候,我原本打算创建一个Day :: Range基类,从中派生WeekDay和MonthDay类,但感觉这创建了一个混乱的API。当我试图封装WeekDay和MonthDay时,我尝试了这个:
这就是我的尝试:
class Day : public Range
{
private:
bool LeapDay;
int wday;
int mday;
public:
Day();
Day(int);
Day(const Day &);
~Day();
Day & operator =(int);
Day & operator =(const Day &);
const wchar_t * const WeekDayAsString() const;
const wchar_t * const MonthDayAsString() const;
bool isLeapDay() const;
};
然后我的困境:由于含糊不清,我不再想继承Range SetMax和SetMin方法。 I.E.我设置了一周中的最大天数或一个月中的几天......好吧,一周的日期是固定的,所以Day :: Range :: max和Day :: Range :: min指的是月和日的日期本周刚刚想通了......
我很好奇其他人会如何设计这个。
致力于:
Date Today(Month(3), Day(19), Year(2012));
灵感来自Scott Meyers,Effective C ++(第3版),第80页[第18项]