以下是C ++多态的一个例子吗?

时间:2013-09-02 13:29:26

标签: c++

我想在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;
}

输出是: 这是一个 这是B

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

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

由于

4 个答案:

答案 0 :(得分:4)

这是多态方法覆盖

多态性(编程中)为不同的基础形式(数据类型)提供相同接口的能力。

Shape类的示例以及可以从中继承的所有类(方形,圆形等等)。

方法覆盖: 它是一种语言功能,允许子类或子类提供已由其某个超类或父类提供的方法的特定实现类。

在您的情况下,BA多态)的特定形式。 B提供了已在基类中实现的方法f()的特定实现(方法覆盖)。


而不是问题,但你的代码正在泄漏:

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/deleteHere是一种解释。

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

答案 1 :(得分:1)

这是多态性和覆盖:覆盖是多态的特定用法。

答案 2 :(得分: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

答案 3 :(得分: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;
}