如何在c++中正确使用虚方法

9rygscc1  于 2023-03-14  发布在  其他
关注(0)|答案(1)|浏览(112)

因此,我有2个类,一个继承自其他类,另一个是枚举类,它在我的问题中不起作用,但我还是要引用它:

enum class PetType {
    Cat,
    Dog,
    Q
};

class Pet {

protected:
    std::string name;
    size_t age;
    std::string breed;
    static PetType spice;

public:
    ...
    friend std::ostream& operator<< (std::ostream& out, const Pet& pet);
    friend std::ostream& operator<< (std::ostream& out, const PetType& pet);
};

class Dog : public Pet {

private:
    static PetType spice;
public:
    ...
};
PetType Dog::spice = PetType::Dog;
PetType Pet::spice = PetType::Q;

主要问题就在这里:我有一个2操作符〈〈。第一个只是帮助我cout〈〈PetType。第二个看起来像这样:

std::ostream& operator<< (std::ostream& out, const Pet& pet) {
    out << "My name is " << pet.name << std::endl;
    out << "I am " << pet.spice << ", " << pet.breed << std::endl;
    out << "I am " << pet.age << " years old" << std::endl;
    return out;
}

而且,我有一个带有不同Pet 's的向量,在将这个向量输出到控制台的函数中,我用cycle for循环它,并像这样做:

std::cout << pets[i];

我想让它输出我的petType,当然。但它输出Q作为我的petType,我选择了一个基本的一个抽象类宠物。我怎么能解决这个问题,请帮助!!!

tag5nh1u

tag5nh1u1#

正如其他人所指出的,不能使用静态成员进行继承。您可以拥有它们,但不能像这样覆盖它们,并期望它们像虚拟成员一样解析。至于操作符〈〈,它知道它只与Pet类一起工作,因此它将始终返回该静态成员,而不是来自Dog的成员。如果您向它提供Dog类,则它将返回来自该成员的成员值。
你有几个选择,不要使PetType spice成为静态的,在Dog构造函数中,像这样分配适当的枚举类型:

class Pet {

protected:
    ...
    PetType spice;

public:
    ...
    friend std::ostream& operator<< (std::ostream& out, const Pet& pet);
    friend std::ostream& operator<< (std::ostream& out, const PetType& pet);
};

class Dog : public Pet {

public:
    Dog() : spice(PetType::Dog) {}
};
std::ostream& operator<< (std::ostream& out, const Pet& pet) {
    out << "My name is " << pet.name << std::endl;
    out << "I am " << pet.spice << ", " << pet.breed << std::endl;
    out << "I am " << pet.age << " years old" << std::endl;
    return out;
}

或者创建虚方法并重写它
一个二个一个一个

相关问题