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();  
}
我不明白这两个方法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();
}
现在,当您将Animal指针传递给foo()并调用talk()成员函数时,它将执行不同的操作,具体取决于它是指向Cat对象还是Dog对象.关键是foo()能够处理从中继承的任何东西Animal.另外,如果一段时间后你创建了一种新Animal类,你可以foo()毫无问题地将它传递给它,而无需修改任何代码foo().