C++中类的继承有关问题

C++中类的继承问题
请问大侠们,在C++中。
为什么总是通过基类的指针或者是引用指向派生类对象,然后在访问派生类成员?
直接通过派生类对象访问自己类中成员不是更好吗?这样不是更简单吗?
难道通过基类的指针或者是引用指向派生类对象然后再访问派生类中成员仅仅是为了能够访问到从基类中继承来的私有成员和保护成员吗?如果是这样的话,那假如在基类中没有私有和保护成员是不是就可以直接通过派生类对象访问自己的成员了(包括从基类继承来的公有成员)?


希望大家能给我个明白的回答,非常感谢!

------解决方案--------------------
实现动态绑定,virtual的含义应该懂吧?
------解决方案--------------------
既然面向对象,为了表现多态。
你用基类类型指针绑定到派生类执行。没问题
如果你用派生类指针绑定基类,访问派生类成员,但绑定的基类,不就越界出错了么
------解决方案--------------------
C++中的多态(虽然多态不是C++所特有的,但是C++中的多态确实是很特殊的)分为静多态和动多态(也就是静态绑定和动态绑定两种现象),静动的区别主要在于这种绑定发生在编译期还是运行期,发生在编译期的是静态绑定,也就是静多态;发生在运行期的则是动态绑定,也就是动多态。

静多态可以通过模板和函数重载来实现(之所说C++中的多态主要还是因为模板这个东西),下面举两个例子:
1)函数模板
template <typename T>
T max(const T& lsh, const T& rhs) 
{
       return (lsh > rhs) ? lsh : rhs;
}
返回两个任意类型对象的最大值(对象),前提是该类型能够使用>运算符进行比较,并且返回值是bool类型。
使用:
int a = 3; int b = 4;
cout << max(a, b) << endl;
float c = 2.4; float d = 1.2;
cout << max(c, d) << endl;
输出结果为:
         4
                2.4
这种绑定发生在编译期,这是由于模板的实例化是发生在编译期的,即在编译时编译器发现你调用max(a, b)时就自动生成一个函数
int max(const int& lsh, const int& rhs) 
{
       return (lsh > rhs) ? lsh : rhs;
}
即将所有的T替换成int;
当你调用max(c, d)时就自动生成一个函数
float max(const float& lsh, const float& rhs)
{
        return (lsh > rhs) ? lsh : rhs;
}
之所以说开始的函数定义是函数模板,就是因为他就像个模子似的,你可以用铝作为原料也可以用石膏或者铜。
2)函数重载:
int max (int a, int b)
{
     return (a > b) ? a : b;
}
int max (int a, int b, int c)
{
     return max(max(a, b), c);
}
两个函数名称一样,参数类型或个数不完全相同,返回值一样(这个不重要)。
使用:
int a = 3, b = 4, c = 5;
cout << max(a, b) << endl;
cout << max(a, b, c) << endl;
输出结果为:
         4
                5
确定函数的过程也发生在编译器,当你使用max(a, b),编译器发现只有两个参数,那么就调用只有两个参数的函数版本,当使用max(a, b, c)时,编译器则使用有3个参数的版本。
通过上面的两个例子,你还可以使用更为方便的模板函数重载:
template <typename T>
T max(const T& lsh, const T& rhs) 
{
       return (lsh > rhs) ? lsh : rhs;
}

template <typename T>
T max(const T& a, const T& b, const T& c)
{
      return max(max(a, b), c);
}
使用
float a = 3.6, b = 1.2, c = 7.8;
cout << max(a, b, c) << endl;
输出:
       7.8
通过参数个数和类型,编译器自动生成和调用对应得函数版本!