`

关于虚函数的两个例子

阅读更多
        晚上看了半天的COM,而里面又是满篇的虚函数。尽管自己对于虚函数有一定的了解,但是远离C++也有一些时日,看来补补课是很有必要的了。
        打开自己收藏夹,目光停留在周星星老大经常出没的地方:vcKBase。于是,从这个宝库中找到了自己需要的两篇文章:C++中的虚函数(一)C++实践系列>C++中的虚函数(virtual function)
        两篇文章都写得不错,尤其是第二篇,写得很有分量,让人收益非浅。而第一篇通过列举的方式将虚函数的特点一一道来也很不错,美中不足的就是作为范例的代码有些瑕疵了。现列举如下:
        1、文章中的第五点通过以下代码以说明多态性:
class A {
public:
    
virtual void f() { cout << "A::f" << endl; }
}
;
class B :public A{
public:
    
virtual void f() { cout << "B::f" << endl;}
}
;
class C :public A {
public:
    
virtual void f() { cout << "C::f" << endl;}
}
;
class Drive : public C {
public:
    
virtual void f() { cout << "D::f" << endl;}
}
;

int main(int argc, char* argv[])
{
    A a;
    B b;
    C c;
    Drive d;
    a.f();
    b.f();
    c.f();
    d.f();
    
return 0;
}


        事实上,这样的代码是不能说明问题的。因为虚函数需要通过指针或者引用才能实现多态的效果。在第一篇文章中,作者就是通过跟以上类似的代码来说明,使用了虚函数并不等于实现了多态。

        2、文章中第七点通过以下代码来说明通过虚函数可以实现基类调用继承类方法:
class A {
public:
    
virtual void fun() {
        cout 
<< "A::fun" << endl;
    }

    
void show() {
        fun();
    }

}
;

class B : public A {
public:
    
virtual void fun() {
        cout 
<< "B::fun" << endl;
    }

}
;

int main() {
    A a;
    a.show();
    
    
return 0;
}
      

            作者仍然犯了跟上面相同的错误,只有将main()函数中的代码改为下面的形式才能达到预期的结果。
int main() {
    A 
*= new B;
    a
-> show();
    
return 0;
}
      
分享到:
评论

相关推荐

    虚函数表解析

    以下是一个具体的例子,展示了如何获取一个类的虚函数表,并从中调用虚函数: ```cpp #include class Base { public: virtual void f() { std::cout ; } virtual void g() { std::cout ; } virtual void h() {...

    c++虚析构函数及虚函数的详细例子.rar

    在这个例子中,`override`关键字确保`print`函数确实重写了基类的虚函数`print`。 总结,C++的虚函数和虚析构函数是实现多态性的重要机制,它们使得基类指针能够透明地操作派生类对象,从而提高了代码的可扩展性和...

    c++继承与多态,虚函数实例

    例如,如果我们有一个基类`Animal`和两个派生类`Dog`和`Cat`,并且`Animal`有一个`makeSound()`虚函数,那么即使我们用`Animal`指针指向`Dog`或`Cat`对象,也能正确地调用到它们各自实现的`makeSound()`方法。...

    c++中子类对象不能调用父类中的虚函数

    在这个例子中,尽管`Derived`类没有定义`func()`,但通过`d.func()`调用时,实际上执行的是`Derived`的版本,因为没有找到明确的重定义。这可能会导致意外的结果,因为用户可能期望调用`Base`的`func()`。 为了正确...

    52_虚函数可以声明为inline吗1

    例如在上面的例子中,`Base` 类和 `Derived` 类都有 `who` 虚函数,尽管在 `Derived` 类中声明为 inline,但当通过 `Base` 类指针 `p` 调用 `who()` 时,内联优化会被忽略,因为此时需要在运行时确定调用 `Base` 的...

    C++中的虚函数与多态

    在这个例子中,`Base`类有一个虚函数`print()`,`Derived`类继承了`Base`并重写了`print()`。当我们使用基类指针指向派生类对象并调用`print()`时,会执行派生类的`print()`函数,这就是多态的表现。 多态...

    使用指针和引用处理虚函数实例

    下面我们将详细探讨这两个主题以及它们与虚函数的关系。 **指针** 指针是C++中的一个特殊类型,它存储的是内存地址,即变量或对象在内存中的位置。通过对指针进行解引用,我们可以访问并操作所指向的对象。在面向...

    在C++多继承体系当中,在派生类中可以重写不同基类中的虚函数。下面就是一个例子:

    然而,问题变得更加复杂,当两个或更多的基类具有同名的虚函数时。假设`CBaseA`和`CBaseB`都有一个名为`Test()`的虚函数,这时如何在`CDerived`中正确地重写它们呢? ```cpp class CBaseA { public: virtual void ...

    C++多态虚函数表

    在这个例子中,`ClassA`有一个虚函数`vfunc1()`,因此它有一个虚函数表。`ClassB`继承自`ClassA`并重写了`vfunc1()`,所以它也有自己的虚函数表,但这个表中的`vfunc1`函数地址是指向`ClassB`中的实现。 #### 三、...

    C++虚函数的应用

    在这个例子中,`Base`类有一个虚函数`func`,而`Derived`类继承了`Base`并重写了这个函数。如果有一个`Base`类型的指针指向`Derived`对象,调用`func`将执行`Derived`的版本。 三、纯虚函数 有些情况下,基类只需要...

    C++ 多态性 虚函数 各种例子

    在这种情况下,虚函数可以解决“菱形问题”(Diamond Problem),这是当一个派生类同时继承两个都包含同一虚函数的基类时可能出现的问题。C++采用“二义性解析”(Dynamic Binding)来解决这一问题,确保调用的总是...

    C++虚函数调用机制初探

    在这个例子中,`Base` 类包含了一个虚函数 `foo()`,而 `Derived` 类继承自 `Base` 并重写了 `foo()` 函数。在 `main` 函数中,首先创建了 `Base` 类的一个对象,并通过基类指针 `pb` 调用了 `foo()` 函数。然后,...

    xuhanshu.rar_C++虚函数_虚函数

    在这个例子中,`print`函数被声明为虚函数,这意味着当通过基类指针或引用来调用这个函数时,实际执行的是子类的版本,如果子类重写了这个函数的话。 **虚函数的作用** 1. **动态绑定**:虚函数的调用是在运行时...

    虚函数的作用和用法C++.doc

    在这个例子中,`print()`函数被声明为虚函数。当一个基类指针或引用指向派生类的对象时,调用`print()`会根据实际对象的类型调用相应的实现,而不是仅限于基类的`print()`。 如果我们有一个派生类`B`,它重写了`...

    c++练习运算符,虚函数

    在C++编程语言中,运算符和虚函数是两个核心概念,它们对于理解和编写复杂的程序至关重要。本练习旨在深入理解并应用这两个知识点。 首先,我们来看“运算符”。C++支持大量的运算符,包括算术运算符(如+、-、*、/...

    多态性与虚函数习题

    - **解释**: 这个例子展示了如何通过指向派生类对象的基类引用调用虚函数。`f(obj)`中的`obj`是`derived`类型,但由于`fun1`不是虚函数,所以输出`base`;`fun2`是虚函数,所以输出`derived`。 6. **答案**: A....

    C++虚函数.docx

    在这个例子中,我们可以看到`Base1`类定义了两个整型成员变量`base1_1`和`base1_2`,以及一个虚函数`base1_fun1`。通过`offsetof`宏,我们可以观察到`base1_1`和`base1_2`的偏移量分别是4和8。这意味着在这两个成员...

    C++虚函数表解析

    `Derived`类继承自`Base`,并重写了前两个虚函数。当创建`Derived`类的对象并通过基类指针调用虚函数时,C++运行时系统会通过查找虚函数表来确定实际应调用的函数。 #### 实现细节 1. **虚函数表的初始化**:在...

Global site tag (gtag.js) - Google Analytics