繁体   English   中英

C ++继承问题

[英]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()接受Aint参数。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM