求教前辈 c++ ,关于纯虚基类

using std::cout;
using std::cin;
using std::endl;
class A
{
public:
virtual void show()const= 0;
virtual void show()= 0;
};
class B :public A
{
public:
virtual void show()
{
cout << "存在 const" << endl;}
virtual void show()const
{
cout << "没有 const" < };
void main()
{
A *a{ new B };
a->show();
B b;
b.show();

B v;
delete a;
a = &v;
a->show();

}
为什么 ?指针和对象是如何选择 派生类中 同名函数的呢?

这个得看C++中的虚函数表机制

虚函数运行机制:http://blog.csdn.net/meetings/article/details/47418441

关于纯虚基类,先说下就是一个虚基类,所谓虚基类,就是一个类里有virtual声明的方法。例如:
class A{
public:
virtual void test();
void test2();
}
也就是虚基类里既有虚函数(virtual声明的方法)又有普通方法。虚函数需要子类继承实现(子类可实现,可不是实现)。
纯虚函数,就是一个类里的方法只有virtual声明的方法,且在方法后面 = 0,称为纯虚函数,而含有纯虚函数的类称为纯虚基类
例:
class A
{
virtual void test1() = 0;
virtual void test1() = 0;
}
纯虚函数,不能进行实例化。 只能由子类继承并实现里面的纯虚函数,且纯虚函数子类必须实现,类似java里的接口。

这个例子中,class A是纯虚的基类。class B是A的派生类,或者说A的实现。
如果基类中的同名函数声明过virtual,则不管指针的类型如何 A* 或者B*,都是调用指针指向的对象的实现。本例中对象的类型都是B。指针的类型有A*和B*。这种情况具体条用那个函数的实现,一般是运行是根据指针所指的对象动态决定的。
如果指针指向的对象类型没有提供函数的实现,一般调用其最近基类的实现。但是不存在某一个虚函数没有任何基类实现。这种情况称为纯虚函数。拥有纯虚函数的类称为纯虚类,纯虚类是不能实例化的,也就是不能创建纯虚类的对象,不论静态的或者用new动态分配的。编译是都回报错。
这个例子中还存在一个情况,两个同名的函数,一个被定义为const,另一个没有。这种情况,两个函数被编译其视为重载。重载函数具体调用哪个,是编译时根据重载推导规则静态决定的。如果对象的指针被定义为const,则调用const版本,否则调用没有const的版本。本例中因为所有指针以及对象都没有声明const,因此调用的是没有const的版本。
如果声明
const A* a {new B}; a->show(); 或者
const B b; b.show();
此时调用的就是const 版本。

不知这样解释是否清楚。