我如何通过抽象 class 传递虚拟方法但可选择不覆盖?
How would I pass a virtual method through an abstract class but optionally not override?
我正在尝试通过抽象 class 传递虚方法,但只有其中的一些派生 classes 覆盖基方法,而其他 运行宁原方法。
class Animal {
virtual void speak() {
//generic speaking code
}
}
class Mammal : Animal {
virtual void speak() = 0;
//allows speak to be overridden by derived class
}
class Dog : Mammal {
//doesn't do anything special with speak(), should run generic speaking code
}
class Human : Mammal {
void speak() {
//overrides generic speaking code
}
}
我想从 Dog 调用 speak() 到 运行 Animal 的 speak() 方法,但是从 Human 调用 speak() 到 运行 它是自己的 speak() 方法。我该怎么做?
您在 Mammal
中不需要这个:
virtual void speak() = 0;
Human
仍然可以覆盖 speak()
就好了,而 Dog
则不必。不过请确保您使用的是 public 继承,而不是私有继承。即:
class Mammal : public Animal {
而不是:
class Mammal : Animal {
作为 side-note,您应该在覆盖虚函数时使用 override
关键字。它有助于捕捉一些常见的错误,即认为您正在覆盖一个函数,而实际上您只是在重载它。所以你的代码应该是:
class Animal {
public:
virtual void speak()
{}
};
class Mammal : public Animal {
};
class Dog : public Mammal {
};
class Human : public Mammal {
public:
void speak() override
{}
};
我正在尝试通过抽象 class 传递虚方法,但只有其中的一些派生 classes 覆盖基方法,而其他 运行宁原方法。
class Animal {
virtual void speak() {
//generic speaking code
}
}
class Mammal : Animal {
virtual void speak() = 0;
//allows speak to be overridden by derived class
}
class Dog : Mammal {
//doesn't do anything special with speak(), should run generic speaking code
}
class Human : Mammal {
void speak() {
//overrides generic speaking code
}
}
我想从 Dog 调用 speak() 到 运行 Animal 的 speak() 方法,但是从 Human 调用 speak() 到 运行 它是自己的 speak() 方法。我该怎么做?
您在 Mammal
中不需要这个:
virtual void speak() = 0;
Human
仍然可以覆盖 speak()
就好了,而 Dog
则不必。不过请确保您使用的是 public 继承,而不是私有继承。即:
class Mammal : public Animal {
而不是:
class Mammal : Animal {
作为 side-note,您应该在覆盖虚函数时使用 override
关键字。它有助于捕捉一些常见的错误,即认为您正在覆盖一个函数,而实际上您只是在重载它。所以你的代码应该是:
class Animal {
public:
virtual void speak()
{}
};
class Mammal : public Animal {
};
class Dog : public Mammal {
};
class Human : public Mammal {
public:
void speak() override
{}
};