0

我想获得 C++ 中以下内容的确切术语。

请考虑以下玩具示例:

class A{
public:
   virtual void f(){ std::cout << "This is A" << std::endl; };
};

class B: public A{
public:
   virtual void f(){ std::cout << "This is B" << std::endl; };
};

int main(int argc, char** argv){
   A* ptr = new A(); //Base class pointer pointing to base class object
   ptr->f(); //Base class method is called
   delete ptr;
   ptr = new B(); ////Base class pointer pointing to derived class object
   ptr->f(); //Derived class method is called
   delete ptr;
   return 0;
}

输出是: 这是 A 这是 B

我想知道确切的 C++ 术语。是多态性还是方法覆盖还是其他?

最主要的是我使用的是基类指针。当指针指向基类对象时,基类方法被调用。当它指向派生类对象时,将调用派生类方法,前提是该方法在两个类中都声明为虚拟。

谢谢

4

4 回答 4

4

它既是多态性又是方法覆盖

多态性:(在编程中)为不同的底层形式(数据类型)呈现相同接口的能力。

Shape 类和所有可以从它继承的类(正方形、圆形等)的示例。

方法覆盖: 它是一种语言特性,允许子类或子类提供其超类或父类之一已经提供的方法的特定实现。

在您的情况下,BA( polymorphism ) 的一种特定形式。并B提供f()已经在基类中实现的方法的具体实现(method-overridding)。


不是关于这个问题,而是你的代码正在泄漏:

int main(int argc, char** argv)
{
   A* ptr = new A(); //Base class pointer pointing to base class object
   ptr->f(); //Base class method is called
   delete ptr;
// ^^^^^^^^^^^
   ptr = new B(); ////Base class pointer pointing to derived class object
   ptr->f(); //Derived class method is called
   delete ptr;
// ^^^^^^^^^^^
   return 1;
   //     ^ Indicate that your program failed ?
}

不要忘记释放动态分配的内存。

如果可能的话,根本不要使用new/delete是一个解释。

return 1;表示您的程序也失败了。

于 2013-09-02T13:52:23.727 回答
1

这既是多态又是覆盖:覆盖是多态的一种特定用途。

于 2013-09-02T13:32:55.637 回答
0

是的,这就是多态性。但是您仍然可以这样做,并且只需使用 C++11 功能(如果您的编译器可以使用这些功能)对您的代码进行一些更改,就不会出现内存泄漏等错误。

class A {
public:
   virtual void f() { std::cout << "This is A" << std::endl; };
};

class B: public A {
public:
   virtual void f() override { std::cout << "This is B" << std::endl; };
};

int main()
{
   auto ptr = std::unique_ptr<A>(new A());
   ptr->f();
   ptr = std::unique_ptr<B>(new B());
   ptr->f();

   return 0;
}
于 2013-09-02T14:01:15.957 回答
0

它是多态性和内存泄漏。

delete问的太多了吗?

int main(int argc, char** argv){
   A* ptr = new A(); //Base class pointer pointing to base class object
   ptr->f(); //Base class method is called
   delete ptr;  // Free up allocated memory.
   ptr = new B(); ////Base class pointer pointing to derived class object
   ptr->f(); //Derived class method is called
于 2013-09-02T13:36:14.377 回答