相关疑难解决方法(0)

虚拟?重写?或两者?C++

在过去的几周里,有些东西正在困扰我的大脑虚拟和覆盖.我已经了解到,当你使用虚函数进行继承时,你必须添加virtual以让编译器知道搜索正确的函数.之后我还了解到在c ++ 11中有一个新关键字 - 覆盖.现在我有点困惑; 我是否需要在程序中同时使用虚拟和覆盖关键字,或者最好只使用其中一个?

为了解释自己 - 我的意思的代码示例:

class Base
{
public:
    virtual void print() const = 0;
    virtual void printthat() const = 0;
    virtual void printit() const = 0;
};

class inhert : public Base
{
public:
    // only virtual keyword for overriding.
    virtual void print() const {}

    // only override keyword for overriding.
    void printthat() const override {}

    // using both virtual and override keywords for overriding.
    virtual void printit() const override {}
};
Run Code Online (Sandbox Code Playgroud)

什么是最好的方法?

c++ c++11

80
推荐指数
2
解决办法
6万
查看次数

有没有办法转发声明协方差?

假设我有这些抽象类,Foo并且Bar:

class Foo;
class Bar;

class Foo
{
public:
  virtual Bar* bar() = 0;
};

class Bar
{
public:
  virtual Foo* foo() = 0;
};
Run Code Online (Sandbox Code Playgroud)

进一步假设我有派生类ConcreteFooConcreteBar.我想协同改进foo()和这样的bar()方法的返回类型:

class ConcreteFoo : public Foo
{
public:
  ConcreteBar* bar();
};

class ConcreteBar : public Bar
{
public:
  ConcreteFoo* foo();
};
Run Code Online (Sandbox Code Playgroud)

这将无法编译,因为我们心爱的单通道编译器不知道ConcreteBar将继承Bar,因此这ConcreteBar是一个完全合法的协变返回类型.普通的前向声明ConcreteBar也不起作用,因为它没有告诉编译器有关继承的任何信息.

这是C++的一个缺点,我将不得不忍受或者是否真的有办法解决这个难题?

c++ covariance forward-declaration

15
推荐指数
1
解决办法
2123
查看次数

标签 统计

c++ ×2

c++11 ×1

covariance ×1

forward-declaration ×1