[英]C++ Inheritance problem
我的课如下:
Class A
{
virtual int doSomethingCool() = 0;
};
Class B : public A
{
int doSomethingCool();
};
现在问题就好了,我有一组依赖于A作为接口的类。 我需要为其中一个派生类更改函数的原型。 即我需要传递一个参数。
Class C: public A
{
int doSomethingCool(int param);
};
有什么建议我可以实现这一目标吗?
不,您不需要将其添加到基类。
class A
{
public:
virtual int doSomethingCool() = 0 {}
};
class B : public A
{
public:
int doSomethingCool() {return 0;}
};
class C: public A
{
private:
int doSomethingCool(); // hide base class version!
public:
int doSomethingCool(int param) {return param;}
};
如果通过基类指针完成操作,仍然可以调用doSomethingCool()
:
C c;
//c.doSomethingCool (); // doesn't work, can't access private member
c.doSomethingCool (42);
A &a = c;
a.doSomethingCool ();
//a.doSomethingCool (42); // doesn't work, no member of A has that signature
将其添加到接口,并默认将其调用现有方法。 您不必执行默认设置,但不必使其纯,否则所有派生类都必须实现。 最好不要定义它或抛出它。 取决于您要实现的目标。
class A
{
public:
virtual int doSomethingCool() = 0;
virtual int doSomethingCool(int param) {doSomethingCool()};
};
使函数doSomethingCool()
接受A
的int
参数。
class A
{
public:
virtual void doSomethingCool(int param) = 0;
};
这里没有问题。 你能行的。 唯一的警告是,它将不会被视为基类虚函数的替代。
class A
{
public:
virtual void doSomethingCool() = 0;
};
class B : public A
{
public:
void doSomethingCool();
};
class C: Public A
{
public:
void doSomethingCool(int param);
};
int main(){}
因此,尽管在技术上可行,但您可能真的想重新看一下接口类A的设计。
一种选择是为A :: doSomethingCool提供默认参数。
virtual void doSomethingCool(int = 0) = 0;
这在语法上不是正确的C ++。
不,您不能更改原型。 如何使用? 如果将调用非参数版本,则参数的值是多少?
我会介绍另一个更具体的接口:
struct A
{
virtual int doSomethingCool() = 0;
};
struct A_specific : A
{
virtual int doSomethingCoolWithThis(int i) = 0;
};
class ConcreteA : public A
{
int doSomethingCool() { return 0; }
};
class ConcreteA_specific : public A_specific
{
int doSomethingCool() { return 0; }
int doSomethingCoolWithThis(int param) { return param; }
};
然后,我将编程到正确的接口:
int main()
{
const A& a1 = ConcreteA();
const A_specific& a2 = ConcreteA_specific();
a1.doSomethingCool();
a2.doSomethingCool();
a2.doSomethingCoolWithThis(2);
}
只是给你另一个想法;-)
祝好运!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.