我正在尝试做这样的事情:
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) 我正在浏览一些代码,我发现了这样的事情:
class GarbageCollectorProcess : public process::Process<GarbageCollectorProcess>
Run Code Online (Sandbox Code Playgroud)
我想知道这是否有效.如果是,那么这不应该导致某种自定义循环,因为我们使用另一个依赖于GarbageCollectorProcess定义的类来定义GarbageCollectorProcess吗?
对于这个问题,不涉及多态性,即不涉及虚方法,不涉及虚基类。以防万一,我的案子不涉及其中任何一个。
假设我有一个类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 指针则撤消该调整。但对于多重继承,“第一个父母”不一定是所有父母的父母。我有一个抽象类 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*?有什么更好的方法吗?
我无法让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)
我不知道出了什么问题,有什么建议吗?
我试图从父级调用一个覆盖函数,发现它只是崩溃了。
这很难描述,所以这里是最小的可重现代码:
#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"。
为什么会崩溃?从低层次的角度来看会发生什么?是A试图调用它自己的init2()吗?
有没有办法做到这一点,所以我不必在每个派生类中添加init2()其构造函数?
我刚读过(第k次)
这是关于模拟虚拟静态成员的问题.我的问题是 - 是什么让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++ ×7
inheritance ×3
c++11 ×2
class ×1
crtp ×1
mixins ×1
static-cast ×1
templates ×1
upcasting ×1
virtual ×1