如何在编译时不知道对象类型?

时间:2013-08-23 03:14:11

标签: c++ compile-time dynamic-binding

我目前正在学习动态绑定和虚函数。这来自Accelerated C ++,第13章:

  

[...]我们希望在运行时做出决定。也就是说,我们想要的   系统根据实际类型运行正确的功能   传递给函数的对象,仅在运行时才知道。

我不明白在编译时对象类型可能是未知的想法。源代码不是很明显吗?

3 个答案:

答案 0 :(得分:1)

C ++有指针的概念,其中变量仅包含实际对象的“句柄”。实际对象的类型在编译时是未知的,仅在运行时。例如:

#include <iostream>
#include <memory>

class Greeter {
public:
    virtual void greet() = 0;
};

class HelloWorld : public Greeter {
public:
    void greet() {std::cout << "Hello, world!\n";}
};

class GoodbyeWorld : public Greeter {
public:
    void greet() {std::cout << "Goodbye, world!\n";}
};

int main() {
    std::unique_ptr<Greeter> greeter(new HelloWorld);
    greeter->greet();    // prints "Hello, world!"
    greeter.reset(new GoodbyeWorld);
    greeter->greet();    // prints "Goodbye, world!"
}

另请参阅:Vaughn Cato的回答,它使用引用(这是另一种保存对象句柄的方法)。

答案 1 :(得分:1)

完全没有。考虑这个例子:

struct A {
  virtual void f() = 0;
};

struct B : A {
  virtual void f() { std::cerr << "In B::f()\n"; }
};

struct C : A {
  virtual void f() { std::cerr << "In C::f()\n"; }
};

static void f(A &a)
{
  a.f(); // How do we know which function to call at compile time?
}

int main(int,char**)
{
  B b;
  C c;
  f(b);
  f(c);
}

编译全局函数f时,无法知道它应该调用哪个函数。实际上,每次都需要调用不同的函数。第一次使用f(b)进行调用时,需要调用B::f(),第二次使用f(c)进行调用时,需要调用C::f()

答案 2 :(得分:0)

假设您有一个指向派生对象的基类的指针

Base *pBase = new Derived;

// During compilation time, compiler looks for the method CallMe() in base class
// if defined in class Base, compiler is happy, no error
// But when you run it, the method call gets dynamically mapped to Derived::CallMe()

// ** provided CallMe() is virtual method in Base and derived class overrides it.

pBase->CallMe(); // the actual object type is known only during run-time.