相关疑难解决方法(0)

C++"接口"和成员方法中的派生类型参数

我正在尝试做这样的事情:

class foo {
    virtual void bool operator==(foo const & rhs) = 0;
};

class bar1 : public foo {
    bool operator==(bar1 const & rhs) { ... }
};

class bar2 : public foo {
    bool operator==(bar2 const & rhs) { ... }
};
Run Code Online (Sandbox Code Playgroud)

也就是说,我想指出实现foo接口的所有类必须operator==为其自己的派生类实现该方法.

但是,编译器抱怨bar1和bar2仍然是抽象类,因为它们还没有实现operator==(foo const &).

我已经考虑过将foo const &bar1和bar2中的函数签名更改为然后dynamic_cast在函数内部执行,但这看起来很乱:

class bar1 : public foo {
    bool operator==(foo const & rhs) {
        const bar1 * casted_rhs = dynamic_cast<const bar1 …
Run Code Online (Sandbox Code Playgroud)

c++ inheritance

2
推荐指数
1
解决办法
490
查看次数

一个类可以继承自己的另一个类模板吗?

我正在浏览一些代码,我发现了这样的事情:

class GarbageCollectorProcess : public process::Process<GarbageCollectorProcess>
Run Code Online (Sandbox Code Playgroud)

我想知道这是否有效.如果是,那么这不应该导致某种自定义循环,因为我们使用另一个依赖于GarbageCollectorProcess定义的类来定义GarbageCollectorProcess吗?

c++ inheritance c++11 template-classes

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

指向派生类的指针的“static_cast&lt;Base*&gt;(static_cast&lt;void*&gt;(衍生))”何时有效?

对于这个问题,不涉及多态性,即不涉及虚方法,不涉及虚基类。以防万一,我的案子不涉及其中任何一个。

假设我有一个类Derived,它有一个明确的可访问父类型Base,没有多态性(没有虚拟方法,没有虚拟基类),但可能涉及间接和/或多继承。进一步假设我有一个有效的指针Derived *derived (指向类型Derived或其子类的对象)。

在这种情况下,我相信static_cast<Base*>(derived)是有效的(产生有效的可用指针)。Base当和之间的祖先链Derived涉及多重继承时,这static_cast可能意味着指针调整以在实例Base内定位实例Derived。为此,编译器需要知道继承链,在本例中他就是这样做的。但是,如果插入了中间转换void *,则编译器将隐藏该继承链信息。对于哪个继承链来说,这样的静态转换仍然有效?我期望以下之一:

  • 一个都没有?访问static_castfrom void 指针是未定义的行为,除非该指针确实指向确切的类型。
  • 对于所有没有多重继承的链?然后,编译器可以保证Base始终位于Derived- 但标准怎么说?
  • 对于所有链,Base在所有中间多重继承链的第一个父类中可以找到什么?Base也许和的开始Derived仍然匹配?
  • 总是?static_castto void 指针始终可以调整到第一个父级的开头,而static_castfrom void 指针则撤消该调整。但对于多重继承,“第一个父母”不一定是所有父母的父母。

c++ inheritance static-cast upcasting

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

如果我想更改函数的返回类型,是否必须覆盖基类中的每个函数?

我有一个抽象类 A ,它返回其类型的指针。然后我有一个派生类 B,它实现了类 A 中定义的方法。我希望类 B 中定义的方法返回类 B 的指针。知道怎么做吗?

class A {
    public:
        virtual A* foo() {}
}
class B: public A {}

B *x = new B();
x->foo();  // This should return B*
Run Code Online (Sandbox Code Playgroud)

我是否需要覆盖 B 中的 foo 才能返回 B*?有什么更好的方法吗?

c++ c++11

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

实现CRTP链表混合C++

我无法让CRTP mixin工作.

这是剥离的实现:

template < typename T >
class AutoSList : public T {
public:
  AutoSList() {}

  ~AutoSList() : _next(nullptr) {}


private:
  static T* _head;
  static T* _tail;
  T* _next;

};

// I really hate this syntax.
template <typename T>
T*  AutoSList<T>::_head = nullptr;
template <typename T>
T*  AutoSList<T>::_tail = nullptr;

class itsybase : public AutoSList < itsybase >
{

};
Run Code Online (Sandbox Code Playgroud)

我正在使用VS2013并收到以下错误:

   error C2504: 'itsybase' : base class undefined
 : see reference to class template instantiation 'AutoSList<itsybase>' being compiled
Run Code Online (Sandbox Code Playgroud)

我不知道出了什么问题,有什么建议吗?

c++ templates mixins crtp

0
推荐指数
1
解决办法
252
查看次数

C++ 从父级调用子函数

我试图从父级调用一个覆盖函数,发现它只是崩溃了。

这很难描述,所以这里是最小的可重现代码:

#include <iostream>

class A
{
public:
    A()
    {
        init1();
    }
    
    void init1()
    {
        printf("1");
        init2();
        printf("2");
    }

    virtual void init2() = 0;
};

class B : public A
{
public:
    B()
    : A()
    {}

    void init2() override
    {
        printf("hello");
    }
};

int main()
{
    B b;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在 MSVC 2019 上它崩溃了,在http://cpp.sh/ 上它输出“1”然后main()返回 0,但我们从未看到"hello""2"

  1. 为什么会崩溃?从低层次的角度来看会发生什么?是A试图调用它自己的init2()吗?

  2. 有没有办法做到这一点,所以我不必在每个派生类中添加init2()其构造函数?

c++ class

-3
推荐指数
1
解决办法
62
查看次数

为什么没有将虚拟静态成员添加为C++的功能?

我刚读过(第k次)

C++静态虚拟成员?

这是关于模拟虚拟静态成员的问题.我的问题是 - 是什么让C++标准委托(或之前的Bjarne Stroustrup)没有将此功能添加到C?他们知道会破坏什么吗?或妨碍任何事情的表现(即使不使用)?

为了更好地说明我对功能定义本身的看法,这里有一些代码:

// This does not compile!
class Base {
    // A pure virtual member - perhaps need to indicate that somehow
    virtual static const string ToWhom; 
    void sayHello() {
        cout << "Hello, " << ToWhom << "!" << endl;
    }
};
class World : public Base {
    static virtual const string ToWhom = "the entire world"s; // C++14 literal
};
class Everybody : public Base {
    static virtual const string ToWhom = "everybody around"s; …
Run Code Online (Sandbox Code Playgroud)

c++ virtual static-methods static-members

-4
推荐指数
1
解决办法
373
查看次数