如何将值正确设置为相同类型的合成成员

Deq*_*ing 1 c++ polymorphism design-patterns

假设我有一个名为Person的班级,他拥有三种宠物:

class Person
{
public:
    accept(Pet a);
private:
    Dog d;  // is a Pet
    Cat c;  // is a Pet
    Fish f; // is a Pet
}

Person::accept(Pet a)
{
    // if pet is Dog, then
    d = a;
    // if pet is Cat, then
    c = a;
    // if pet is Fish, then
    f = a;
};
Run Code Online (Sandbox Code Playgroud)

我想typeid可以在这里使用.但是,它对我来说仍然很奇怪.

是否有某种多态性,虚函数或某些OOP模式可以应用?

- 编辑 -

对不起这里的坏例子.让我尝试另一个:

// Usually a context contains three different resources:
class Context
{
public:
    setResource(Resource *r);
private:
    Buffer *b_;    // is a Resource
    Kernel *k_;    // is a Resource
    Sampler *s_;   // is a Resource
};
Context::setResource(Resource *r) { // same logic as Person::accept() above }
Context::handlingBuffer() { if (b_) b_->init(); ... }
Context::run() { 
    if (b_ && k_) { 
        k_.setBuffer(b_); 
        k_.run(); 
    }
}
...
Run Code Online (Sandbox Code Playgroud)

在这种情况下,看上去就像添加Resource *r_[3]Context会让事情变得更加复杂.

那么,是否可以将Resource的基类指针传递给setResource()它,它可以自动决定要设置哪个资源?

jua*_*nza 5

由于你Pets按值保持,你可以忘记多态并只是重载accept成员函数:

class Person
{
public:
    accept(const Dog& a)  { d_ = a; }
    accept(const Cat& a)  { c_ = a; }
    accept(const Fish& a) { f_ = a; }
private:
    Dog d_;  // is a Pet
    Cat c_;  // is a Pet
    Fish f_; // is a Pet
};
Run Code Online (Sandbox Code Playgroud)