gpt4 book ai didi

c++ - 同名继承函数和重写虚函数有什么区别?

转载 作者:太空狗 更新时间:2023-10-29 23:42:33 25 4
gpt4 key购买 nike

#include <iostream> 
using namespace std;

class base
{
public:
void f() {cout << "base" << endl;}
virtual void v() {cout << "base (virtual)" << endl;}


};

class deriv : public base
{
public:
void f() {cout << "deriv" << endl;}
void v() {cout << "deriv (overridden)" << endl;}
};


int main()
{
base b;
b.f();
b.v();

deriv d;
d.f();
d.v();
}

我不明白这两种方法 f 和 v 之间有什么真正的区别:如果我用另一个同名的函数替换一个函数,我不是在“替换”它吗?即使我仍然可以通过创建一个 base* 指针然后使其指向派生对象来访问它,我也不明白这里有什么样的 C++ “干净”用法。

当不使用虚拟(意味着可覆盖的方法)方法时,有人可以告诉我这是否有合法用途,以及与使用覆盖的虚拟方法有什么不同?

编辑:我很抱歉在 markdown 中使用了错误的语法,但 markdown 是一个非常糟糕的选择,它很复杂而且非常反复无常(我更喜欢纺织品呵呵)。EDIT2:抱歉,我没有猜到 101010101010101 按钮是用来插入代码的,我通常只是手工操作 :(

最佳答案

重点是得到 polymorphic behavior 。如果基类中的函数被声明为虚拟函数,并且派生类覆盖了它,如果您使用 类指针调用该函数,它将自动调用派生类中的函数。如果它不是虚拟的,那么它将调用基类函数。

基本思想是这样你就可以做这样的事情:

class Animal
{
public:
virtual void talk() = 0;
};

class Dog : public Animal
{
public:
void talk() { cout << "Bark" << endl; }
};

class Cat : public Animal
{
public:
void talk() { cout << "Meow" << endl; }
};

void foo(Animal* a)
{
a->talk();
}

现在,当您将 Animal 指针传递给 foo() 时并调用 talk()成员函数,它会做一些不同的事情取决于它是否指向一个 Cat对象或 Dog目的。重点是 foo()能够处理任何继承自 Animal 的东西.另外,如果一段时间后您创建了一种新的 Animal类,你可以把它传递给foo()没问题,无需修改 foo() 中的任何代码.

关于c++ - 同名继承函数和重写虚函数有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3763770/

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