【发布时间】:2014-05-08 13:07:23
【问题描述】:
以下是静态绑定还是动态绑定?既然我知道,我的指针在编译时指向的对象类是什么,我的猜测是它是静态的......
class Base
{
void print() const;
};
class Derived : public Base
{
void print() const;
};
int main()
{
Base base;
Base *basePtr = &base;
basePtr->print();
}
为什么我们应该使用动态绑定而不是静态绑定?我不明白为什么我们应该使用虚函数而不是简单地以这种方式调用函数base.print()(对于上面的示例)。该方法已经“理解”了哪个print() 函数调用了对象的正确类,而无需使用多态性和虚函数。
更新
// Point class definition represents an x-y coordinate pair.
#ifndef POINT_H
#define POINT_H
class Point {
public:
Point( int = 0, int = 0 ); // default constructor
void setX( int ); // set x in coordinate pair
int getX() const; // return x from coordinate pair
void setY( int ); // set y in coordinate pair
int getY() const; // return y from coordinate pair
virtual void print() const; // output Point object
private:
int x; // x part of coordinate pair
int y; // y part of coordinate pair
}; // end class Point
#endif
// Circle class contains x-y coordinate pair and radius.
#ifndef CIRCLE_H
#define CIRCLE_H
#include "point.h" // Point class definition
class Circle : public Point {
public:
// default constructor
Circle( int = 0, int = 0, double = 0.0 );
void setRadius( double ); // set radius
double getRadius() const; // return radius
double getDiameter() const; // return diameter
double getCircumference() const; // return circumference
double getArea() const; // return area
virtual void print() const; // output Circle object
private:
double radius; // Circle's radius
}; // end class Circle
#endif
// Introducing polymorphism, virtual functions and dynamic
// binding.
#include <iostream>
using std::cout;
using std::endl;
using std::fixed;
#include <iomanip>
using std::setprecision;
#include "point.h" // Point class definition
#include "circle.h" // Circle class definition
int main()
{
Point point( 30, 50 );
Point *pointPtr = 0;
Circle circle( 120, 89, 2.7 );
Circle *circlePtr = 0;
// set floating-point numeric formatting
cout << fixed << setprecision( 2 );
// output objects point and circle using static binding
cout << "Invoking print function on point and circle "
<< "\nobjects with static binding "
<< "\n\nPoint: ";
point.print(); // static binding
cout << "\nCircle: ";
circle.print(); // static binding
// output objects point and circle using dynamic binding
cout << "\n\nInvoking print function on point and circle "
<< "\nobjects with dynamic binding";
// aim base-class pointer at base-class object and print
pointPtr = &point;
cout << "\n\nCalling virtual function print with base-class"
<< "\npointer to base-class object"
<< "\ninvokes base-class print function:\n";
pointPtr->print();
// aim derived-class pointer at derived-class
// object and print
circlePtr = &circle;
cout << "\n\nCalling virtual function print with "
<< "\nderived-class pointer to derived-class object "
<< "\ninvokes derived-class print function:\n";
circlePtr->print();
// aim base-class pointer at derived-class object and print
pointPtr = &circle;
cout << "\n\nCalling virtual function print with base-class"
<< "\npointer to derived-class object "
<< "\ninvokes derived-class print function:\n";
pointPtr->print(); // polymorphism: invokes circle's print
cout << endl;
return 0;
} // end main
【问题讨论】:
-
没有动态绑定。也不清楚为什么有没有使用的派生类的定义。
-
尝试将
main中的第一行替换为Derived base;,看看调用的是哪个函数。 -
另外,
virtual对于基类中的析构函数非常重要。 -
@tillaert 为什么?你能解释一下吗?
-
@user3379939 看到这个问题:stackoverflow.com/questions/461203/…
标签: c++ binding polymorphism