纯虚函数,它是如何工作的

时间:2012-06-12 02:57:18

标签: c++ virtual-functions

我对纯虚函数有疑问。我不清楚它是如何工作的以及何时我们需要使用纯虚函数。这是我不明白的例子:

file.h

class A
{
public :
            A();
            ~A();

            virtual void func1(void) = 0;
            virtual UINT32 func2(void) = 0;
            UINT32 initialize(void) = 0;
}


file.cpp

UINT32 A:initialize (void)
{
            func1();
            func2();
            return (result);
}

任何人都可以详细解释这个例子实际上做了什么以及结果是什么? 我非常感谢你的帮助和知识。非常感谢你。

2 个答案:

答案 0 :(得分:1)

(注意,initialize()的声明不应该是虚拟的,initialize()的实现可能应该返回func2()。因为这是一个例子,它并不重要initialize()可以,但它应该正确编译。)

虚函数的主要目的是实现多态。

A定义了两个纯虚方法,initialize调用它们。这允许程序中的代码在不知道子类的情况下初始化类型A的某些内容。可能有许多A的子类,每个子类在func1()func2()中可能会略有不同。由于只知道A的代码有时会通过A初始化不同类型的对象,因此A可以称为多态类型。

class B : public A {
    void func1 () { std::cout << "B::func1" << std::endl; }
    UINT32 func2 () { return 1; }
};

class C : public A {
    void func1 () { std::cout << "C::func1" << std::endl; }
    UINT32 func2 () { return 2; }
};

void call_initialize (A *a) {
    std::cout << a->initialize()  << std::endl;
}

B b;
C c;
call_initialize(&b);
call_initialize(&c);

输出结果:

B::func1
1
C::func1
2

这是多态行为的一个示例,因为输出是不同的,具体取决于AB是否C子类化。

答案 1 :(得分:0)

功能func1&amp; func2未在A中实现(根据显示的代码) 如果它们被实现,那么它们就会被调用。如果有A的派生类,并且派生类的对象是多态创建的,即

class B : public A
{
 .....
};

A* obj = new B();

obj->initialize();

如果B实现了B版本的func1()和func2(),则会调用它们。

正如Ethan的评论所述,你没有从func2()中获取结果 所以你需要写

UINT32 result = func2(); 

return func2();