jok*_*oon 2 c++ virtual inheritance overriding class
#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();
}
Run Code Online (Sandbox Code Playgroud)
我不明白这两个方法f和v之间有什么真正的区别:如果我用另一个同名的函数替换一个函数,我不是"替换"它吗?即使我仍然可以通过创建base*指针然后使其指向派生对象来访问它,我不明白这里有什么样的"干净"使用C++.
当不使用虚拟(意思是可重写方法)方法时,有人可以告诉我是否有合法用途,以及与使用重写虚拟方法有什么不同?
编辑:我很抱歉使用标记错误的语法,但降价是一个非常糟糕的选择,它是复杂的,相当反复无常(我更喜欢纺织嘿嘿).EDIT2:对不起我没想到101010101010101按钮意味着插入代码,我通常只是手工做:(
重点是获得多态行为.如果基类中的函数被声明为虚拟,并且派生类会覆盖它,那么如果使用基类指针调用该函数,它将自动调用派生类中的函数.如果它不是虚拟的,那么它将调用基类函数.
基本的想法是你可以做这样的事情:
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();
}
Run Code Online (Sandbox Code Playgroud)
现在,当您将Animal指针传递给foo()并调用talk()成员函数时,它将执行不同的操作,具体取决于它是指向Cat对象还是Dog对象.关键是foo()能够处理从中继承的任何东西Animal.另外,如果一段时间后你创建了一种新Animal类,你可以foo()毫无问题地将它传递给它,而无需修改任何代码foo().