gpt4 book ai didi

c++ - 传递基类指针

转载 作者:太空狗 更新时间:2023-10-29 20:19:14 24 4
gpt4 key购买 nike

场景:我有以下定义的类。

class Baseclass { };
class DerivedTypeA : public Baseclass { };
class DerivedTypeB : public Baseclass { };
// ... and so on ...

class Container
{
list<Baseclass*> stuff;
list<DerivedTypeA*> specific_stuff;
// ... initializing constructors and so on ...
public:
void add(Baseclass * b)
{
stuff.add(b);
}
void add(DerivedTypeA * a)
{
stuff.add(a);
specific_stuff.add(a);
}
};

class ContainerOperator
{
Container c;
// ... initializing constructors and so on ...
public:
void operateOnStuff(Baseclass * b)
{
// This will always use "void add(Baseclass * b)" no matter what object b really is.
c.add(b);
}
};

// ...

containerOperator.operateOnStuff(new DerivedTypeA());

所以,我想做的是在Container中以某种特殊的方式处理某个派生类。

问题 void add(DerivedTypeA * a) 从未被调用。我显然做错了什么。 执行我在此尝试实现的目标的正确方法是什么?

最佳答案

C++ 中的重载解析发生在编译时,而不是运行时。解决此类问题的“通常”方法是使用 Visitor pattern .

您可以通过使用 CRTP 实现 Visitor 来减少样板复制粘贴的数量。 .如果您将 CRTP 用于 Base::accept,则无需再在派生类中定义它。

这是一个与您的类似的程序,但更简单一些:

#include <iostream>

class Base; class Derived;
struct Operation {
void add(Base *b) {
std::cout << "Base\n";
}
void add(Derived *b) {
std::cout << "Derived\n";
}
void visit(Base *b); // need to define this after Base class

};


struct Base {
virtual ~Base() {}
virtual void accept(Operation &o)
{
o.add(this);
}


};

void Operation::visit(Base *b) {
b->accept(*this);
}

struct Derived : public Base {
void accept(Operation &o)
{
o.add(this);
}

};



int main() {

Operation o;
Base b;
Derived d;

Base *ptrb = &b;
Base *ptrd = &d;
o.add(ptrb); // These two print "Base"
o.add(ptrd);
o.visit(ptrb); // "Base"
o.visit(ptrd); // "Derived"
}

关于c++ - 传递基类指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1764179/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com